首页 > 代码库 > Aizu - 2249 Road Construction
Aizu - 2249 Road Construction
题目:给出若干个建筑之间的一些路,每条路都有对应的长度和需要的花费,问在保证源点1到其他个点的距离最短的情况下,最少的花费是多少/
思路:和一般的最短路问题相比,多了一个 数组id【i】,用来记录到达i点在距离最短的情况下是由那条边到达的。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<vector>#include<set>#include<queue>#include<string>#include<algorithm>#define MAXSIZE 1000005#define LL long long#define INF 0x3f3f3f3fusing namespace std;//给出若干个建筑之间的一些路,每条路都有对应的长度和需要的花费,//问在保证源点1 到其他个点的距离最短的情况下,最少的花费是多少int n,m,vis[MAXSIZE],a[MAXSIZE],k,dist[MAXSIZE],id[MAXSIZE];struct node{ int u; int v; int w; int c; int next;}G[MAXSIZE];void Add(int u,int v,int w,int c){ G[k].u = u; G[k].v = v; G[k].w = w; G[k].c = c; G[k].next = a[u]; a[u] = k++;}int dij(){ memset(vis,0,sizeof(vis)); memset(id,-1,sizeof(id)); dist[1] = 0; int minn ,p; for(int i=1;i<k;i++) { minn = INF; for(int j=1;j<=n;j++) { if(!vis[j] && dist[j] < minn) { minn = dist[j]; p = j; } } if(minn == INF) break; vis[p] = 1; for(int j=a[p];j!=-1;j=G[j].next) { int v = G[j].v; if(dist[v] > dist[p] + G[j].w && !vis[v]) //距离更短就更新 { dist[v] = dist[p] + G[j].w; id[v] = j; } //距离相同,花费更小就更新 else if(id[v]!=-1 && dist[v] == dist[p] + G[j].w && G[j].c < G[id[v]].c && !vis[v]) { id[v] = j; } } } int sum=0; for(int i=1;i<=n;i++) { if(id[i] == -1) continue; else sum += G[id[i]].c; } return sum;}void Init(){ memset(a,-1,sizeof(a)); memset(vis,0,sizeof(vis)); for(int i=0;i<MAXSIZE;i++) dist[i] = INF; k = 1;}int main(){ int u,v,w,c; while(scanf("%d%d",&n,&m),n+m) { Init(); for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&u,&v,&w,&c); Add(u,v,w,c); Add(v,u,w,c); } int ans = dij(); printf("%d\n",ans); } return 0;}
Aizu - 2249 Road Construction
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。