日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1078 文化之旅[最短路]

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1078 文化之旅[最短路] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目背景

本題是錯題,后來被證明沒有靠譜的多項式復雜度的做法。測試數據非常的水,各種玄學做法都可以通過(比如反著掃),不代表算法正確。因此本題題目和數據僅供參考。

題目描述

有一位使者要游歷各國,他每到一個國家,都能學到一種文化,但他不愿意學習任何一種文化超過一次(即如果他學習了某種文化,則他就不能到達其他有這種文化的國家)。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化(即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家)。

現給定各個國家間的地理關系,各個國家的文化,每種文化對其他文化的看法,以及這位使者游歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。

輸入輸出格式

輸入格式:

?

第一行為五個整數?N,K,M,S,T,每兩個整數之間用一個空格隔開,依次代表國家個數(國家編號為1到?N),文化種數(文化編號為1K),道路的條數,以及起點和終點的編號(保證?S?不等于T);

第二行為N個整數,每兩個整數之間用一個空格隔開,其中第?i個數Ci?,表示國家i的文化為Ci?。

接下來的?K行,每行K個整數,每兩個整數之間用一個空格隔開,記第i?行的第 j 個數為aij?aij?=1?表示文化?ii排斥外來文化j(i等于jj時表示排斥相同文化的外來人),aij?=0?表示不排斥(注意i?排斥?j?并不保證j一定也排斥i)。

接下來的?M行,每行三個整數?u,v,d,每兩個整數之間用一個空格隔開,表示國家?u與國家?v有一條距離為d的可雙向通行的道路(保證u不等于?v,兩個國家之間可能有多條道路)。

?

輸出格式:

?

一個整數,表示使者從起點國家到達終點國家最少需要走的距離數(如果無解則輸出-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?必須要經過國家1,而國家2的文明卻排斥國家?1?的文明,所以不可能到達國家?2。

輸入輸出樣例說明2

路線為1?->2

【數據范圍】

對于 100%的數據,有2N100

1K100

1≤M≤N^2

i≤K

1u,vN

1d1000,ST,1S,TN

NOIP 2012 普及組 第四題

?

解析:

噢這道題真是秀到我了,這數據是搞笑嗎?這不是我說,就是道水題啊。。。


思路:

搞個數組標一下能不能走完事。后來想到甚至可以如果兩個國家的文化沖突,而這兩個國家之間有路,直接不加這條路就得了。

然后就是最短路咯,板子題不多講。

參考代碼:

可能有點啰嗦,確實可以優化的。。。但是我懶~

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 這也能過。。。玄學 62 else printf("-1"); 63 return 0; 64 }

?

轉載于:https://www.cnblogs.com/DarkValkyrie/p/10991350.html

總結

以上是生活随笔為你收集整理的P1078 文化之旅[最短路]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。