求让城市1到其他城市在保证最短路的情况下求最小花费,最短路水题。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int INF=1e9; struct edge { int u,v; int len,cost,next; }e[100010<<2]; int head[100010<<2]; int vis[100010<<2]; int dis[100010<<2]; int ans[100010<<2]; int cnt; void Initial() { memset(head,-1,sizeof(head)); } void spfa() { memset(vis,0,sizeof(vis)); for(int i=1;i<=100010;i++){ dis[i]=INF; ans[i]=INF; } //memset(ans,1,sizeof(ans)); //memset(dis,1,sizeof(dis)); queue<int> que; while(!que.empty()){ que.pop(); } que.push(1); vis[1]=1; dis[1]=0; ans[1]=0; while(!que.empty()){ int d=que.front(); que.pop(); vis[d]=0; for(int i=head[d];i!=-1;i=e[i].next){ if(dis[e[i].v]==dis[d]+e[i].len && ans[e[i].v]>e[i].cost){ ans[e[i].v]=e[i].cost; } if(dis[e[i].v]>dis[d]+e[i].len){ dis[e[i].v]=dis[d]+e[i].len; ans[e[i].v]=e[i].cost; if(!vis[e[i].v]){ que.push(e[i].v); vis[e[i].v]=1; } } } } } int main() { int n,m; while(~scanf("%d%d",&n,&m)&& (n!=0 || m!=0)){ cnt=0; Initial(); for(int i=1;i<=m;i++){ scanf("%d%d%d%d",&e[cnt].u,&e[cnt].v,&e[cnt].len,&e[cnt].cost); e[cnt].next=head[e[cnt].u]; head[e[cnt].u]=cnt; cnt++; e[cnt].u=e[cnt-1].v; e[cnt].v=e[cnt-1].u; e[cnt].cost=e[cnt-1].cost,e[cnt].len=e[cnt-1].len; e[cnt].next=head[e[cnt].u]; head[e[cnt].u]=cnt; cnt++; } spfa(); int Cost=0; for(int i=2;i<=n;i++){ Cost+=ans[i]; } printf("%d\n",Cost); } return 0; }
时间: 2024-11-08 21:04:52