NOIP2012pj文化之旅[floyd]

Candy?發表於2016-09-07

描述

有一位使者要遊歷各國,他每到一個國家,都能學到一種文化,但他不願意學習任何一種文化超過一次,即如果他學習了某種文化,則他就不能到達其他有這種文化的國家。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化,即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家。 現給定各個國家間的地理關係,各個國家的文化,每種文化對其他文化的看法,以及這位使者遊歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。

格式

輸入格式

第一行為五個整數N,K,M,S,T,每兩個整數之間用一個空格隔開,依次代表國家個數(國家編號為1到N),文化種數(文化編號為1到K),道路的條數,以及起點和終點的編號(保證S不等於T) 第二行為N個整數,每兩個整數之間用一個空格隔開,其中第i個數Ci,表示國家i的文化為Ci。 接下來的K行,每行K個整數,每兩個整數之間用一個空格隔開,記第i行的第j個數為aij,aij= 1表示文化i排斥外來文化j,i等於j時表示排斥相同文化的外來人,aij= 0表示不排斥,注意i排斥j並不保證j一定也排斥i。 接下來的M行,每行三個整數u,v,d,每兩個整數之間用一個空格隔開,表示國家u與國家v有一條距離為d的可雙向通行的道路,保證u不等於v,兩個國家之間可能有多條道路。

輸出格式

輸出只有一行,一個整數,表示使者從起點國家到達終點國家最少需要走的距離數,如果無解則輸出-1。

樣例1

樣例輸入1[複製]

 
2 2 1 1 2
1 2
0 1
1 0
1 2 10

樣例輸出1[複製]

 
-1

樣例2

樣例輸入2[複製]

 
2 2 1 1 2
1 2
0 1
0 0
1 2 10

樣例輸出2[複製]

 
10

限制

1S

提示

對於20%的資料 有2≤N≤8,K≤5
對於30%的資料 有2≤N≤10,K≤5
對於50%的資料 有2≤N≤20,K≤8
對於70%的資料 有2≤N≤100,K≤10
對於100%的資料 有2≤N≤100,1≤K≤100,1≤M≤N^2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1≤S,T≤N。

來源

NOIP2012普及組第四題

-------------------------------------------------------------------

又是普及組資料超水系列

i排斥j或i和j相同文化,d[i][j]=INF

floyd輕鬆水果

 貌似標解是dfs

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=105,INF=1e9;
int n,k,m,s,t,c[N],u,v,w,flag[N][N];
int d[N][N];
void floyd(){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(d[i][k]<INF&&d[k][j]<INF)
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
int main(){
    scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&flag[i][j]);
    for(int i=1;i<=m;i++) {
        scanf("%d%d%d",&u,&v,&w);
        d[u][v]=d[v][u]=w; //printf("num%d\n",i);
    }
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=n;j++){
            if(d[i][j]==0) d[i][j]=INF;
            if(c[i]==c[j]) d[i][j]=INF;
            if(flag[c[i]][c[j]]) d[i][j]=INF;
        }
    floyd();
    int ans=min(d[s][t],d[t][s]);
    if(ans==INF) printf("-1");
    else printf("%d",ans);
}

 


 

資料太水了,不考慮學過的文化排斥也可以,灰哥隨便造組資料就卡掉了

4 4 5 1 4 1 2 3 4 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 1 1 3 1 2 3 1 1 4 1000 3 4 1

相關文章