NOIP2012 文化之旅
有一位使者要游歷各國,他每到一個國家,都能學到一種文化,但他不愿意學習任何一種文化超過一次(即如果他學習了某種文化,則他就不能到達其他有這種文化的國家)。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化(即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家)。
現給定各個國家間的地理關系,各個國家的文化,每種文化對其他文化的看法,以及這位使者游歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。
輸入描述?Input Description第一行為五個整數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,兩個國家之間可能有多條道路)。
輸出描述?Output Description輸出只有一行,一個整數,表示使者從起點國家到達終點國家最少需要走的距離數(如果無解則輸出-1)。
樣例輸入?Sample Input輸入樣例1
2 2 1 1 2
1 2
0 1
1 0
1 2 10
?
輸入樣例2
2 2 1 1 2
1 2
0 1
0 0
1 2 10
?
樣例輸出?Sample Output輸出樣例1
-1
?
輸出樣例2
10
?
數據范圍及提示?Data Size & Hint【輸入輸出樣例1說明】
由于到國家2必須要經過國家1,而國家2的文明卻排斥國家1的文明,所以不可能到達國家2。
【輸入輸出樣例2說明】
路線為1 -> 2。
【數據范圍】
對于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≤N2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1 ≤S, T≤N。
#include<iostream> #include<cstring> using namespace std; bool ec[101][101]; int mp[101][101]; int ct[101],study[101]; int dis[100]; int n,k,m,bg,ed,flag; bool pd(int x) {for(int i=1;i<=k;i++){if(study[i]&&ec[ct[x]][i])return 0;}return 1; } int search(int x) {flag=0;if(!study[ct[x]]){flag=1;study[ct[x]]=1; }for(int i=1;i<=n;i++){if(mp[x][i]+dis[x]<dis[i]&&pd(i)){dis[i]=mp[x][i]+dis[x];search(i);}}if(flag==1)study[ct[x]]=0; } int main() {cin>>n>>k>>m>>bg>>ed;for(int i=1;i<=n;i++)cin>>ct[i];for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)cin>>ec[i][j];memset(mp,127/3,sizeof(mp));for(int i=1;i<=n;i++)dis[i]=999999;for(int i=1;i<=m;i++){int x,y,v;cin>>x>>y>>v;mp[x][y]=mp[y][x]=v;}dis[bg]=0;search(bg);if(dis[ed]!=999999)cout<<dis[ed];else cout<<-1;return 0; }?
轉載于:https://www.cnblogs.com/hyfer/p/5852522.html
總結
以上是生活随笔為你收集整理的NOIP2012 文化之旅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#枚举类型和结构体
- 下一篇: C#里partial关键字的作用(转摘)