codevs 1316 文化之旅

2021-08-10 02:20:43 字數 2826 閱讀 9720

題目描述 description

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

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

輸入描述 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。

加上關於「即如果他學習了某種文化,則他就不能到達其他有這種文化的國家」會wa,,為什麼……

不加就a

而且因為陣列開小調了半個上午……

變數跟變數不能重名!!

嗯 以下是spfa:

#include

#include

#include

#include

using

namespace

std;

int first[10000+1],nxt[10000+1],tot;

int c[1000+1],dist[10000+1];

bool a[1005][1005],used[10000+1];

int n,m,k,s,tt;

struct edge

l[10005

<<1];

void build(int f,int t,int v)

; nxt[tot]=first[f];

first[f]=tot;

return;

}void spfa(int s)}}

}}int main()

spfa(s);

if(dist[tt]<0x3f3f3f3f) cout

<'\n';

else

puts("-1\n");

return

0;}

試試dfs?

好 不會。

#include

#include

#include

#include

using

namespace

std;

int first[10000+1],nxt[10000+1],tot;

int c[1000+1],dist[10000+1];

bool a[1005][1005],used[10000+1],vis[10000+1],flag;

int n,m,k,s,tt;

struct edge

l[10005

<<1];

void build(int f,int t,int v)

; nxt[tot]=first[f];

first[f]=tot;

return;

}bool can(int x)

return1;}

void dfs(int s)

}

}int main()

dist[s]=0;

dfs(s);

if(dist[tt]<0x3f3f3f3f) cout

<'\n';

else

puts("-1\n");

return

0;}

簡直就是爆搜

NOIP2012 文化之旅

題解 求最短路問題,想著用floyd或dijkstra解決,最後用了floyd,在輸入的時候 對文化排斥和文化相同的提前進行處理,若不滿足題目條件的路我們直接把它 斷掉,也就是說在進行floyd主演算法之前我們的圖就已經是滿足題目條件的 這時只需要用floyd模板套用就行了,也不用新增額外語句 當然...

luogu1078 文化之旅

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

Luogu P1078 文化之旅

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