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;
}
View Code

 

posted @ 2023-07-12 11:52  JMXZ  阅读(20)  评论(0)    收藏  举报