P1078 文化之旅[最短路]
題目背景
本題是錯(cuò)題,后來被證明沒有靠譜的多項(xiàng)式復(fù)雜度的做法。測(cè)試數(shù)據(jù)非常的水,各種玄學(xué)做法都可以通過(比如反著掃),不代表算法正確。因此本題題目和數(shù)據(jù)僅供參考。
題目描述
有一位使者要游歷各國,他每到一個(gè)國家,都能學(xué)到一種文化,但他不愿意學(xué)習(xí)任何一種文化超過一次(即如果他學(xué)習(xí)了某種文化,則他就不能到達(dá)其他有這種文化的國家)。不同的國家可能有相同的文化。不同文化的國家對(duì)其他文化的看法不同,有些文化會(huì)排斥外來文化(即如果他學(xué)習(xí)了某種文化,則他不能到達(dá)排斥這種文化的其他國家)。
現(xiàn)給定各個(gè)國家間的地理關(guān)系,各個(gè)國家的文化,每種文化對(duì)其他文化的看法,以及這位使者游歷的起點(diǎn)和終點(diǎn)(在起點(diǎn)和終點(diǎn)也會(huì)學(xué)習(xí)當(dāng)?shù)氐奈幕?#xff09;,國家間的道路距離,試求從起點(diǎn)到終點(diǎn)最少需走多少路。
輸入輸出格式
輸入格式:
?
第一行為五個(gè)整數(shù)?N,K,M,S,T,每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開,依次代表國家個(gè)數(shù)(國家編號(hào)為1到?N),文化種數(shù)(文化編號(hào)為1到K),道路的條數(shù),以及起點(diǎn)和終點(diǎn)的編號(hào)(保證?S?不等于T);
第二行為N個(gè)整數(shù),每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開,其中第?i個(gè)數(shù)Ci?,表示國家i的文化為Ci?。
接下來的?K行,每行K個(gè)整數(shù),每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開,記第i?行的第 j 個(gè)數(shù)為aij?,aij?=1?表示文化?ii排斥外來文化j(i等于jj時(shí)表示排斥相同文化的外來人),aij?=0?表示不排斥(注意i?排斥?j?并不保證j一定也排斥i)。
接下來的?M行,每行三個(gè)整數(shù)?u,v,d,每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開,表示國家?u與國家?v有一條距離為d的可雙向通行的道路(保證u不等于?v,兩個(gè)國家之間可能有多條道路)。
?
輸出格式:
?
一個(gè)整數(shù),表示使者從起點(diǎn)國家到達(dá)終點(diǎn)國家最少需要走的距離數(shù)(如果無解則輸出-1)。
?
輸入輸出樣例
輸入樣例#1:?2 2 1 1 2 1 2 0 1 1 0 1 2 10 輸出樣例#1:?
-1 輸入樣例#2:?
2 2 1 1 2 1 2 0 1 0 0 1 2 10 輸出樣例#2:?
10
說明
輸入輸出樣例說明1
由于到國家?2?必須要經(jīng)過國家1,而國家2的文明卻排斥國家?1?的文明,所以不可能到達(dá)國家?2。
輸入輸出樣例說明2
路線為1?->2
【數(shù)據(jù)范圍】
對(duì)于 100%的數(shù)據(jù),有2≤N≤100
1≤K≤100
1≤M≤N^2
i≤K
1≤u,v≤N
1≤d≤1000,S≠T,1≤S,T≤N
NOIP 2012 普及組 第四題
?
解析:
噢這道題真是秀到我了,這數(shù)據(jù)是搞笑嗎?這不是我說,就是道水題啊。。。
思路:
搞個(gè)數(shù)組標(biāo)一下能不能走完事。后來想到甚至可以如果兩個(gè)國家的文化沖突,而這兩個(gè)國家之間有路,直接不加這條路就得了。
然后就是最短路咯,板子題不多講。
參考代碼:
可能有點(diǎn)啰嗦,確實(shí)可以優(yōu)化的。。。但是我懶~
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<ctime> 6 #include<cstdlib> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<map> 11 #define N 10010 12 #define INF 1030000 13 using namespace std; 14 priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; 15 struct node{ 16 int from,to,next,ver,edge; 17 }g[N<<2]; 18 int head[N<<2],c[N<<2],d[N<<2],n,m,s,t,k,tot; 19 bool v[N<<2],vc[N<<1][N<<1],cul[N<<2]; 20 void add(int x,int y,int f,int t,int val) 21 { 22 g[++tot].from=f,g[tot].to=t,g[tot].ver=y,g[tot].edge=val; 23 g[tot].next=head[x],head[x]=tot; 24 } 25 void dijkstra(int x) 26 { 27 memset(v,0,sizeof(v)); 28 memset(d,0x3f,sizeof(d)); 29 q.push(make_pair(0,x)); 30 d[x]=0; 31 while(q.size()) 32 { 33 int index=q.top().second;q.pop(); 34 if(v[index]||cul[c[index]]) continue; 35 v[index]=1;cul[c[index]]=1; 36 for(int i=head[index];i;i=g[i].next){ 37 int y=g[i].ver,from=g[i].from,to=g[i].to,z=g[i].edge; 38 if(vc[from][to]||cul[c[y]]) continue;//能不能走 39 if(d[y]>d[index]+z){ 40 d[y]=d[index]+z; 41 q.push(make_pair(d[y],y)); 42 } 43 } 44 } 45 } 46 int main() 47 { 48 scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); 49 for(int i=1;i<=n;i++) 50 scanf("%d",&c[i]); 51 for(int i=1;i<=k;i++) 52 for(int j=1;j<=k;j++) 53 scanf("%d",&vc[i][j]); 54 55 for(int i=1;i<=m;i++){ 56 int x,y,val; 57 scanf("%d%d%d",&x,&y,&val); 58 add(x,y,c[x],c[y],val);add(y,x,c[y],c[x],val); 59 } 60 dijkstra(s); 61 if(d[t]<INF) printf("%d\n",d[t]);//emmm 這也能過。。。玄學(xué) 62 else printf("-1"); 63 return 0; 64 }?
轉(zhuǎn)載于:https://www.cnblogs.com/DarkValkyrie/p/10991350.html
總結(jié)
以上是生活随笔為你收集整理的P1078 文化之旅[最短路]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity FrameWork 操作使
- 下一篇: 关于vs2008改变工程路径