洛谷 P1078 文化之旅

题目链接-> 

题解:         

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int u,v,w,n,k,m,s,t,f[110][110],dis[10],vis[110][110];
bool flag[110][110][110];
inline int read(){
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(int x){
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
int main(int argc, char const *argv[]){
    memset(f,0x3f,sizeof(f));
    n=read(),k=read(),m=read(),s=read(),t=read();
    for (int i = 1; i <= n; ++i){
        dis[i]=read();
        f[i][i]=0;
    }
    for (int i = 1; i <= k; ++i){
        for (int j = 1; j <= k; ++j){
            vis[i][j]=read();
        }
    }
    for (int i = 1; i <= m; ++i){
        u=read(),v=read(),w=read();
        if (!vis[dis[v]][dis[u]]&&dis[u]!=dis[v]){
            f[u][v]=min(w,f[u][v]);
        }
        if (!vis[dis[u]][dis[v]]&&dis[u]!=dis[v]){
            f[v][u]=min(w,f[v][u]);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            flag[i][j][dis[i]]=flag[i][j][dis[j]]=1;
        }
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;j++){
                if(!vis[dis[k]][dis[i]]&&!vis[dis[j]][dis[k]]&&!flag[i][k][dis[j]]&&!flag[k][j][dis[i]]&&f[i][k]+f[k][j]<f[i][j]){
                    for(int t=1;t<=n;t++){
                        flag[i][j][t]=flag[i][k][t]||flag[k][j][t];
                    }
                    flag[i][j][dis[k]]=1;
                    f[i][j]=f[i][k]+f[k][j];
                }
            }
        }
    }
    if(f[s][t]==0x3f3f3f3f) printf("-1\n");
    else printf("%d\n",f[s][t]);
    return 0;
}

一世安宁

posted @ 2018-09-26 20:22  GTBA  阅读(250)  评论(4编辑  收藏  举报