NOIP2012 文化之旅 最短路

2021-08-21 10:38:27 字數 3440 閱讀 7497

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

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

輸入格式

第一行為五個整數n,k

,m,s

,t

n,k,m,s,t

n,k,m,

s,t,每兩個整數之間用乙個空格隔開,依次代表國家個數(國家編號為1到n

nn),文化種數(文化編號為1

11到k

kk),道路的條數,以及起點和終點的編號(保證 s≠t

s \neq t

s̸​=t);

第二行為n

nn個整數,每兩個整數之間用乙個空格隔開,其中第i

ii個數c

ic_i

ci​,表示國家i

ii的文化為c

ic_i

ci​。

接下來的k

kk行,每行k

kk個整數,每兩個整數之間用乙個空格隔開,記第i

ii行的第j

jj個數為 aij

a_ai

j​,a ij

=1

a_ =1

aij​=1

表示文化 i 排斥外來文化j

jj(i=j

i = j

i=j時表示排斥相同文化的外來人),aij

=0

a_=0

aij​=0

表示不排斥(注意i

ii排斥j

jj 並不保證j

jj一定也排斥i

ii)。

接下來的m

mm行,每行三個整數u,v

,d

,u,v,d,

u,v,d,

每兩個整數之間用乙個空格隔開,表示國家u

uu與國家v

vv有一條距離為d

dd的可雙向通行的道路(保證u

uu不等於v

vv,兩個國家之間可能有多條道路)。

輸出格式

輸出只有一行,乙個整數,表示使者從起點國家到達終點國家最少需要走的距離數(如果無解則輸出-1)。

輸入樣例#1

2 2 1 1 2

1 20 1

1 01 2 10

輸出樣例#1

-1

輸入樣例#2

2 2 1 1 2

1 20 1

0 01 2 10

輸出樣例#2

輸入輸出樣例#1:

由於到國家 2 必須要經過國家 1,而國家 2 的文明卻排斥國家 1 的文明,所以不可能到達國家 2。

輸入輸出樣例#2:

路線為1->2。

對於 100%的資料,有$2≤n≤100,1≤k≤100,1≤m≤n^2 $

1 ≤k

i≤k,

1≤u,

v≤n,

1≤d≤

1000,s

≠t,1

≤s,t

≤n

1≤k_i≤k ,1≤u,v≤n,1≤d≤1000,s≠t,1≤s,t≤n

1≤ki​≤

k,1≤

u,v≤

n,1≤

d≤10

00,s

̸​=t

,1≤s

,t≤n

這道題讓我們求s

ss到t

tt的最短路,自然地想到用最短路徑演算法。可這裡的限制條件太多,怎麼下手?別急,慢慢來。

首先,由於資料範圍較小,可以用floyd,也可用spfa。對於學到的文化,這裡用乙個map從int到bool的對映儲存。其實相當於可以作為資料型別的陣列。每學到乙個新文化,就將map

[i]=

1map[i]=1

map[i]

=1,其中i

ii是學到的文化,並將其作為引數,放在佇列裡。

其次,對於特殊情況的處理以及重邊的處理。即c[s

]=c[

t]

c[s]=c[t]

c[s]=c

[t]時,要進行特判,直接輸出−1-1

−1。雖然還有一種更簡單的求最短路的方法,但這樣可以對付加強資料。

另外,此題還可用dfs做,這裡就不貼**了。

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp make_pair

#define inf 0x7fffffff/2

using

namespace std;

int n,k,m,s,t;

int c[

1005

],a[

105]

[105];

int g[

105]

[105];

int now[

105]

;int d[

105]

,vis[

105]

;queueint,map<

int,

bool

>

>

> q;

pair<

int,map<

int,

bool

>

> temp;

void

spfa

(int v0)}if

(flag)

continue;if

(d[i]

>d[w]

+g[w]

[i])}}

}}intmain()

if(c[s]

==c[t]

)spfa

(s);

if(d[t]

==inf)

printf

("-1");

else

printf

("%d"

,d[t]);

return0;

}

NOIP2012 文化之旅

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

NOIP2012 JuniorT4 文化之旅

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

文化之旅(NOIP2012普及組第四題)

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