P1078 文化之旅[最短路]
題目背景
本題是錯題,后來被證明沒有靠譜的多項式復雜度的做法。測試數據非常的水,各種玄學做法都可以通過(比如反著掃),不代表算法正確。因此本題題目和數據僅供參考。
題目描述
有一位使者要游歷各國,他每到一個國家,都能學到一種文化,但他不愿意學習任何一種文化超過一次(即如果他學習了某種文化,則他就不能到達其他有這種文化的國家)。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化(即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家)。
現給定各個國家間的地理關系,各個國家的文化,每種文化對其他文化的看法,以及這位使者游歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。
輸入輸出格式
輸入格式:
?
第一行為五個整數?N,K,M,S,T,每兩個整數之間用一個空格隔開,依次代表國家個數(國家編號為1到?N),文化種數(文化編號為1到K),道路的條數,以及起點和終點的編號(保證?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%的數據,有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 普及組 第四題
?
解析:
噢這道題真是秀到我了,這數據是搞笑嗎?這不是我說,就是道水題啊。。。
思路:
搞個數組標一下能不能走完事。后來想到甚至可以如果兩個國家的文化沖突,而這兩個國家之間有路,直接不加這條路就得了。
然后就是最短路咯,板子題不多講。
參考代碼:
可能有點啰嗦,確實可以優化的。。。但是我懶~
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 文化之旅[最短路]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity FrameWork 操作使
- 下一篇: 关于vs2008改变工程路径