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

 

 

posted @ 2013-10-23 00:28  qilinart  阅读(270)  评论(0编辑  收藏  举报