最短路径问题。一定要注意将visited[u]是否等于0加入判断!很关键,还是没有理解透,所以才忘了加。(第42行和第45行)
其实图相关的题通过率蛮高的...套路题,坑少。
1 #include <iostream> 2 #include<cstdio> 3 #include<vector> 4 #define inf 0x3f3f3f3f 5 using namespace std; 6 struct Edge{ 7 int next,dis,cos; 8 }; 9 int main() 10 { 11 int N,M,S,D; 12 scanf("%d%d%d%d",&N,&M,&S,&D); 13 vector<int> V(N); 14 vector<vector<Edge> > E(N); 15 int c1,c2,dis,cos; 16 Edge e; 17 for(int i=0;i<M;i++){ 18 scanf("%d%d%d%d",&c1,&c2,&dis,&cos); 19 e.next=c2; 20 e.dis=dis; 21 e.cos=cos; 22 E[c1].push_back(e); 23 e.next=c1; 24 E[c2].push_back(e); 25 } 26 vector<int> visited(N,0); 27 vector<int> pre(N,0); 28 vector<int> distance(N,inf); 29 vector<int> sum(N); 30 distance[S]=0; 31 sum[S]=0; 32 int min,u; 33 for(int i=0;i<N;i++){ 34 min=inf; 35 u=S; 36 for(int j=0;j<N;j++){ 37 if(visited[j]==0&&min>distance[j]){ 38 min=distance[j]; 39 u=j; 40 } 41 } 42 visited[u]=1;//! 43 for(int j=0;j<E[u].size();j++){ 44 int v=E[u][j].next; 45 if(visited[v]!=0)//! 46 continue; 47 if(distance[u]+E[u][j].dis<distance[v]){ 48 distance[v]=distance[u]+E[u][j].dis; 49 pre[v]=u; 50 sum[v]=sum[u]+E[u][j].cos; 51 } 52 else if(distance[u]+E[u][j].dis==distance[v]){ 53 if(sum[u]+E[u][j].cos<sum[v]){ 54 sum[v]=sum[u]+E[u][j].cos; 55 pre[v]=u; 56 } 57 } 58 } 59 } 60 vector<int> res; 61 int k=D; 62 while(k!=S){ 63 res.push_back(k); 64 k=pre[k]; 65 } 66 res.push_back(S); 67 for(int i=res.size()-1;i>=0;i--) 68 printf("%d ",res[i]); 69 printf("%d ",distance[D]); 70 printf("%d",sum[D]); 71 return 0; 72 }
原文地址:https://www.cnblogs.com/wsshub/p/12565507.html
时间: 2024-10-09 17:16:24