7-13 天梯地图 (Dijkstr)

    科技2025-08-01  10

    #include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int N=550; int n,m; int le[N][N]; int tmm[N][N]; bool st[N]; int d1[N],d2[N],d3[N]; int num[N]; int p1[N],p2[N]; void dij1(int s,int e){ memset(st,false,sizeof st); memset(num,INF,sizeof num); memset(d1,INF,sizeof d1); num[s]=1; st[s]=1; // cout<<s<<endl; // cout<<le[s][0]<<endl; for(int i=0;i<n;i++){ d1[i]=le[s][i]; //cout<<d1[i]<<" "; p1[i]=s; if(i!=s) num[i]=num[s]+1; } // cout<<endl; p1[s]=-1; for(int i=1;i<n;i++){ int tmp=INF,k; for(int j=0;j<n;j++){ if(!st[j]&&tmp>d1[j]){ tmp=d1[j]; k=j; } } if(k==e||tmp==INF) return; //cout<<k<<endl; st[k]=1; for(int j=0;j<n;j++){ if(!st[j]){ if(d1[j]>d1[k]+le[k][j]){ d1[j]=d1[k]+le[k][j]; num[j]=num[k]+1; p1[j]=k; } else if(d1[j]==d1[k]+le[k][j]&&num[j]>num[k]+1){ num[j]=num[k]+1; p1[j]=k; } } } } } void dij2(int s,int e){ memset(st,false,sizeof st); memset(d2,INF,sizeof d2); memset(d3,INF,sizeof d3); for(int i=0;i<n;i++){ d2[i]=tmm[s][i]; d3[i]=le[s][i]; p2[i]=s; } p2[s]=-1; st[s]=1; for(int i=1;i<n;i++){ int tmp=INF,k; for(int j=0;j<n;j++){ if(!st[j]&&tmp>d2[j]){ tmp=d2[j]; k=j; } } if(k==e||tmp==INF) return; st[k]=1; for(int j=0;j<n;j++){ if(!st[j]){ if(d2[j]>d2[k]+tmm[k][j]){ d2[j]=d2[k]+tmm[k][j]; d3[j]=d3[k]+le[k][j]; p2[j]=k; } else if(d2[j]==d2[k]+tmm[k][j]&&d3[j]>d3[k]+le[k][j]){ d3[j]=d3[k]+le[k][j]; p2[j]=k; } } } } } void init(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j){ le[i][j]=tmm[i][j]=0; } else{ le[i][j]=tmm[i][j]=INF; } } } } int main(){ scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++){ int a,b,c,d,e; scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); if(c==1){ le[a][b]=min(le[a][b],d); tmm[a][b]=min(tmm[a][b],e); //cout<<le[a][b]<<endl; } else{ le[a][b]=min(le[a][b],d);le[b][a]=min(le[b][a],d); tmm[a][b]=min(tmm[a][b],e);tmm[b][a]=min(tmm[b][a],e); //cout<<tmm[a][b]<<endl; } } int sa,ed;scanf("%d%d",&sa,&ed); //cout<<sa<<endl; dij1(sa,ed); dij2(sa,ed); vector<int> v1,v2; //cout<<p1[ed]<<p1[p1[ed]]<<endl; // cout<<d2[ed]<<endl<<d1[ed]<<endl; int g=ed; while(p1[g]!=-1){ //cout<<g<<endl; v1.push_back(g); g=p1[g]; } v1.push_back(sa); g=ed; while(p2[g]!=-1){ //cout<<g<<endl; v2.push_back(g); g=p2[g]; } v2.push_back(sa); if(v1==v2){ printf("Time = %d; Distance = %d: ",d2[ed],d1[ed]); for(int i=v1.size()-1;i>=0;i--){ if(i==0){ printf("%d\n",v1[i]); } else{ printf("%d => ",v1[i]); } } } else{ printf("Time = %d: ",d2[ed]); for(int i=v2.size()-1;i>=0;i--){ if(i==0){ printf("%d\n",v2[i]); } else{ printf("%d => ",v2[i]); } } printf("Distance = %d: ",d1[ed]); for(int i=v1.size()-1;i>=0;i--){ if(i==0){ printf("%d\n",v1[i]); } else{ printf("%d => ",v1[i]); } } } return 0; }

     

    Processed: 0.014, SQL: 8