描述
有一位使者要遊歷各國,他每到一個國家,都能學到一種文化,但他不願意學習任何一種文化超過一次,即如果他學習了某種文化,則他就不能到達其他有這種文化的國家。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化,即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家。 現給定各個國家間的地理關係,各個國家的文化,每種文化對其他文化的看法,以及這位使者遊歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。
格式
輸入格式
第一行為五個整數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。
限制
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