1. 程式人生 > >F - Dwarf Tower (Gym - 100269D )

F - Dwarf Tower (Gym - 100269D )

題目 log sum spfa const main ace blog light

- 題目大意

如題所示獲得一個物品有兩種方式:
1. 直接購買該物品,第i件物品花費的錢為ci
2. 用兩件其他物品合成所需的物品,一共有m種合成方式。
問獲得1號物品的最少花費。

- 解題思路

把每種合成方式當成路徑(註意是有向圖把每種方式弄成兩條邊)枚舉物品,以第i個物品為起點做spfa,做n次,找出最短路,即最少花費。

- 代碼

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e5+50;
struct edge{
    int v,w;
    edge(){};
    edge(int v,int w):v(v),w(w){};
};
vector<edge>e[N];
int d[N];
int inq[N];
int n,m;
int SPFA() {
    queue<int> Q;
    for(int i=1;i<=n;i++)
        {
            Q.push(i);
            inq[i]=1;
        }
    while(Q.size()) {
        int u = Q.front();
        Q.pop();
        inq[u] = 0;
        for(int i = 0; i<e[u].size(); i++) {
            int v = e[u][i].v, w = e[u][i].w;
            if(d[w] > d[v] + d[u]) {
                d[w] = d[v] + d[u];
                if(!inq[w]) {
                    Q.push(w);
                    inq[w] = 1;
                }
            }
        }
    }
    return d[1];
}
int main()
{
    int x,y,z;
   scanf("%d%d",&n,&m);
   for(int i=1;i<=n;i++)
    scanf("%d",&d[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        e[y].push_back(edge(z,x));
        e[z].push_back(edge(y,x));
    }
    int sum=SPFA();
    printf("%d\n",sum);
}

  

F - Dwarf Tower (Gym - 100269D )