P1078 文化之旅

题目

代码

#include<iostream>
#include<cstdio> #include<queue> using namespace std; int n,k,m,s,t,g[105][105],head[105],Next[10005],adj[10005],ti[10005],p,i,j,cul[105],f[105][105],u,v,w,ans=1<<30,vis[105]; void Push(int u,int v,int w) { Next[++p]=head[u]; head[u]=p; adj[p]=v; ti[p]=w; } void dfs(int i,int s) { int j,k,flag=0; if(s+f[i][t]>ans) return; if(i==t) { ans=s; return; } vis[++p]=cul[i]; for(j=head[i];j!=0;j=Next[j]) { flag=1; for(k=1;k<=p;k++) if(vis[k]==cul[adj[j]]||g[cul[adj[j]]][vis[k]]==1) flag=0; if(flag) dfs(adj[j],s+ti[j]); } p--; } int main(){ scanf("%d %d %d %d %d",&n,&k,&m,&s,&t); for(i=1;i<=n;i++) scanf("%d",&cul[i]); for(i=1;i<=k;i++) for(j=1;j<=k;j++) scanf("%d",&g[i][j]); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) f[i][j]=1<<29; f[i][i]=0; } for(i=1;i<=m;i++) { scanf("%d %d %d",&u,&v,&w); if(g[cul[v]][cul[u]]==0&&cul[u]!=cul[v]) { Push(u,v,w); f[u][v]=w; } } for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(p=1;p<=n;p++) f[i][j]=min(f[i][j],f[i][p]+f[p][j]); p=0; if(f[s][t]!=1<<29) printf("%d",f[s][t]); else printf("-1"); } 

此题复制有乱码,于是贴了链接。

猜你喜欢

转载自www.cnblogs.com/xiongchongwen/p/11137590.html