P1078 [NOIP2012 普及组] 文化之旅
->分析题目-> vis[i][j] ->最短路 floyd ->方便+100^3
->dij->单源最短
->floyd->两点见最短->用于任何图,不管有向无向,边权正负,但是最短路必须存在。(不能有个负环)
#include<bits/stdc++.h> using namespace std; int n,k,m,s,t,c[120],g[120][120],f[120][120],aa,bb,cc; const int INF=0x3f3f3f3f; int main() { cin>>n>>k>>m>>s>>t; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=INF; for(int i=1;i<=n;i++) f[i][i]=0; for(int i=1;i<=n;i++){ cin>>c[i]; } for(int i=1;i<=k;i++){ for(int j=1;j<=k;j++){ cin>>g[j][i]; } } for(int i=1;i<=m;i++) { cin>>aa>>bb>>cc; if(!g[c[aa]][c[bb]]&&c[bb]!=c[aa]) f[aa][bb]=min(f[aa][bb],cc);//相等不可以 if(!g[c[bb]][c[aa]]&&c[bb]!=c[aa]) f[bb][aa]=min(f[bb][aa],cc); } if(c[s]==c[t]){ cout<<"-1"; return 0; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(f[i][k]+f[k][j]<f[i][j]) { f[i][j]=f[i][k]+f[k][j]; } } } } if(f[s][t]==INF) cout<<"-1"; else cout<<f[s][t]; return 0; }

浙公网安备 33010602011771号