1. 程式人生 > >AOJ-2249-Road Construction-dijkstra-最小花費

AOJ-2249-Road Construction-dijkstra-最小花費

tps ack .net esp vector max ret post space

Road Construction

題意:在一個無向圖中,每條邊上有建設的花費和路徑的長度,要求求得,在保持每個點到1號點最小距離不變的情況下,求最小的總花費;

思路:用dijkstra 找出每個點的最小距離,再重新從1出發,找出每個點對應的最小花費;(一開始自己想的是直接在dijkstra的時候把花費算出來,好想不對)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include 
<queue> const int maxn = 10007; const int inf =1e9; using namespace std; struct node{ int to,d,c; node(){} node (int to,int d,int c):to(to),d(d),c(c){} }; vector<node>mp[maxn]; int dis[maxn],cost[maxn],n,m,ans = 0; void init(){ for(int i=1;i<=n;i++) { mp[i].clear(); dis[i]
= inf; cost[i] = 0; } } void add(int u,int v,int d,int c) { mp[u].push_back(node(v,d,c)); } int main(){ while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; init(); for(int i=1;i<=m;i++) { int u,v,d,c; scanf(
"%d%d%d%d",&u,&v,&d,&c); add(u,v,d,c); add(v,u,d,c); } priority_queue<pair<int,int> >q; dis[1]=0; cost[1]=0; q.push (make_pair(-dis[1],1)) ; while(!q.empty()) { int now = q.top().second; q.pop(); for(int i=0;i<mp[now].size();i++) { int v=mp[now][i].to; int d=mp[now][i].d; int c=mp[now][i].c; if(dis[v]>dis[now]+d) { dis[v] = dis[now]+d; q.push (make_pair(-dis[v],v)); } } } ans = 0; for(int i=2;i<=n;i++) //計算最小花費 { int minc = inf; for(int j=0;j<mp[i].size();j++) //只用算和已修好的點中最小的花費 { node tmp = mp[i][j]; if(tmp.d+dis[tmp.to]==dis[i]&&minc>tmp.c) { minc = mp[i][j].c; } } ans += minc; } printf("%d\n",ans); } return 0; }

AOJ-2249-Road Construction-dijkstra-最小花費