NOIP2012T4 文化之旅
4 4 4 1 4
1 2 3 4
0 0 0 0
0 0 0 1
0 0 0 0
0 1 0 0
1 2 1
2 3 1
3 4 1
1 3 10
#include<cstdio> #include<algorithm> #define UP(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; const int N=110,INF=1000000000; int c[N],a[N][N],bs[N][N]; int n,k,m,s,t; int main(){ scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); UP(i,1,n)scanf("%d",&c[i]); UP(i,1,k)UP(j,1,k)scanf("%d",&bs[i][j]); UP(i,1,n)UP(j,1,n)a[i][j]=INF; UP(i,1,n)a[i][i]=0; UP(i,1,m){ int u,v,w; scanf("%d%d%d",&u,&v,&w); a[u][v]=a[v][u]=min(a[u][v],w); } UP(i,1,n)UP(j,1,n) if(bs[c[i]][c[j]])a[j][i]=INF; UP(i,1,n) if(bs[c[i]][c[t]]) UP(j,1,n)a[j][i]=a[i][j]=INF; UP(k,1,n)UP(i,1,n)UP(j,1,n) if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j]; printf("%d\n",a[s][t]==INF?-1:a[s][t]); return 0; }
#include<cstdio> #include<algorithm> #define UP(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; const int N=110,INF=1000000000; int c[N],a[N][N],bs[N][N]; int n,k,m,s,t; int main(){ scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); UP(i,1,n)scanf("%d",&c[i]); UP(i,1,k)UP(j,1,k)scanf("%d",&bs[i][j]); UP(i,1,n)UP(j,1,n)a[i][j]=INF; UP(i,1,n)a[i][i]=0; UP(i,1,m){ int u,v,w; scanf("%d%d%d",&u,&v,&w); a[u][v]=a[v][u]=min(a[u][v],w); } UP(i,1,n)UP(j,1,n) if(bs[c[i]][c[j]])a[j][i]=INF; UP(k,1,n)UP(i,1,n)UP(j,1,n){ if(bs[c[j]][c[i]] || bs[c[k]][c[i]] || bs[c[j]][c[k]])continue; if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j]; } printf("%d\n",a[s][t]==INF?-1:a[s][t]); return 0; }
#include<cstdio> #include<algorithm> #define UP(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; const int maxn=110,INF=1000000000; int c[maxn],a[maxn][maxn],bs[maxn][maxn]; int n,k,m,s,t; int main(){ scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); UP(i,1,n)scanf("%d",&c[i]); UP(i,1,k)UP(j,1,k)scanf("%d",&bs[i][j]); UP(i,1,n)UP(j,1,n)a[i][j]=INF; UP(i,1,n)a[i][i]=0; UP(i,1,m){ int u,v,w; scanf("%d%d%d",&u,&v,&w); a[u][v]=a[v][u]=min(a[u][v],w); } UP(k,1,n)UP(i,1,n)UP(j,1,n){ if(bs[c[i]][c[j]] || bs[c[i]][c[k]] || bs[c[k]][c[j]])continue; if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j]; } printf("%d\n",a[s][t]==INF?-1:a[s][t]); return 0; }
DFS(90分)
var n,m,k,S,T,i,j,u,v,d,now,res:longint; c,vt,vc:array[0..100]of longint; a,dist:array[0..100,0..100]of longint; procedure DFS(i:longint); var j:longint; begin if i=T then begin res:=now; exit; end; for j:=1 to n do if (dist[i,j]<>0)and(a[c[j],c[i]]=0)and(vt[j]=0)and(vc[c[j]]=0)and(now+dist[i,j]<res) then begin inc(now,dist[i,j]); vt[j]:=1; vc[c[j]]:=1; DFS(j); dec(now,dist[i,j]); vt[j]:=0; vc[c[j]]:=0; end; end; begin assign(input,'culture.in'); reset(input); assign(output,'culture.out'); rewrite(output); read(n,k,m,S,T); for i:=1 to n do read(c[i]); for i:=1 to k do for j:=1 to k do read(a[i,j]); for i:=1 to m do begin read(u,v,d); dist[u,v]:=d; dist[u,v]:=d; end; res:=maxlongint; vt[S]:=1; vc[c[S]]:=1; DFS(S); if res=maxlongint then writeln(-1) else writeln(res); close(input); close(output); end.
FOLYD算法
const INF=1000000; var n,k,m,s,t,i,j,q,u,v,d:longint; a,dist:array[1..110,1..110] of longint; c:array[1..110] of longint; begin assign(input,'culture.in'); reset(input); assign(output,'culture.out'); rewrite(output); readln(n,k,m,s,t); for i:=1 to n do for j:=1 to n do dist[i,j]:=INF; for i:=1 to n do read(c[i]); for i:=1 to k do for j:=1 to k do read(a[i,j]); for i:=1 to m do begin readln(u,v,d); if a[c[v],c[u]]=0 then dist[u,v]:=d; if a[c[u],c[v]]=0 then dist[v,u]:=d; end; for k:=1 to n do for i:=1 to n do for j:=1 to n do if dist[i,k]+dist[k,j]<dist[i,j] then dist[i,j]:=dist[i,k]+dist[k,j]; if dist[s,t]<INF then writeln(dist[s,t]) else writeln(-1); close(input); close(output); end.
个人感觉算法有问题
反例
3 2 2 1 3
1 2 1
0 0
0 0
1 2 10
2 3 5
结果应是-1,但这里结果是15