1. 程式人生 > >洛谷 P1078 文化之旅

洛谷 P1078 文化之旅

flag for color col 題解 ont [] problem tro

題目鏈接->

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

題解:

#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; }

一世安寧

洛谷 P1078 文化之旅