F - Dwarf Tower (Gym - 100269D )
阿新 • • 發佈:2018-02-15
題目 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 )