注意先保证距离最短,再来判断价格
邻接矩阵回朝内存 ,要用邻接表的
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f struct ac{ int v,dis,cost; }; int n,m; int dis[10002]; int cost[10002]; int vis[10002]; vector<ac>rode[10002]; void djst() { memset(dis,inf,sizeof(dis)); memset(cost,inf,sizeof(cost)); memset(vis,0,sizeof(vis)); dis[1]=0; cost[1]=0; while(1) { int k=-1,dmin=inf,cmin=inf; for(int j=1;j<=n;j++) { if(!vis[j]) { if(dis[j]<dmin) k=j,dmin=dis[j],cmin=cost[j]; else if(dis[j]==dmin) { if(cost[j]<cmin) k=j,dmin=dis[j],cmin=cost[j]; } } } if(k==-1) return ; vis[k]=1; for(int i=0;i<rode[k].size();i++) { int j=rode[k][i].v; if(!vis[j]) { if(dis[k]+rode[k][i].dis<dis[j]) { dis[j]=dis[k]+rode[k][i].dis; cost[j]=rode[k][i].cost; } else if(dis[k]+rode[k][i].dis==dis[j]&&cost[j]>rode[k][i].cost) { cost[j]=rode[k][i].cost; } } } } } int main() { while(cin>>n>>m) { if(n+m==0) break; for(int i=1;i<=m;i++) { int a,c,b,d; cin>>a>>b>>c>>d; ac tt; tt.v=b,tt.dis=c,tt.cost=d; rode[a].push_back(tt); tt.v=a; rode[b].push_back(tt); } djst(); int ans=0; for(int i=1;i<=n;i++){ rode[i].clear(); ans+=cost[i]; } cout<<ans<<endl; } return 0; }