NYOJ 118 路方案 第二小的跨越

2021-09-07 02:52:32 字數 1569 閱讀 9932

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:5

描寫敘述

南將軍率領著很多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1~n。因為交通不太便利,南將軍準備修路。

如今已經知道哪些城市之間能夠修路。假設修路,花費是多少。

如今。軍師小工已經找到了一種修路的方案,可以使各個城市都聯通起來,並且花費最少。

可是。南將軍說,這個修路方案所拼成的圖案非常不吉利,想讓小工計算一下是否存在第二種方案花費和剛才的方案一樣,如今你來幫小工寫乙個程式算一下吧。

輸入

第一行輸入乙個整數t(1

輸出對於每組測試資料輸出yes或no(假設存在兩種以上的最小花費方案則輸出yes,假設最小花費的方案僅僅有一種,則輸出no)

例子輸入

2

3 31 2 1

2 3 2

3 1 3

4 41 2 2

2 3 2

3 4 2

4 1 2

例子輸出

no

yes

prim+次小生成樹。

次小生成樹的兩種演算法:

演算法1、step 1.  先用prim求出最小生成樹t.

在prim的同一時候。用乙個矩陣max[u][v] 記錄 在t中鏈結隨意兩點u,v的唯一的

路中權值最大的那條邊的權值. (注意這裡).

這是非常easy做到的。由於prim是每次增加乙個結點s, 而設已經標號了的結點

集合為w, 則w中全部的結點到s的路中的最大權值的邊就是當前增加的這條邊.

step 1 用時 o(v^2).

step 2.  列舉全部不在t中的邊uv, 增加邊uv則必定替換權為max[u][v]的邊。

演算法2、先用prim求出最小生成樹t。

列舉t中的每一條邊,把它刪除,求剩下的圖的最小生成樹。

選全部列舉得到的生成樹中的最小的那乙個。

ac碼:

#include#include#define inf 99999999

int g[505][505],visit[505],lowcost[505];

int repair[505][505],pre[505],f[505][505];

int main()

memset(repair,0,sizeof(repair));

for(i=0;ilowcost[j])

}if(min==inf)

break;

repair[pre[k]][k]=repair[k][pre[k]]=0;

mintree+=min;

visit[k]=1;

for(j=1;j<=v;j++)

{if(visit[j])

f[k][j]=f[j][k]=f[j][pre[k]]>g[pre[k]][k]?f[j][pre[k]]:g[pre[k]][k];

if(!visit[j]&&g[k][j]

NYOJ 118 修路方案

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍率領著許多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1 n,由於交通不太便利,南將軍準備修路。現在已經知道哪些城市之間可以修路,如果修路,花費是多少。現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通...

NYOJ 118 修路方案

時間限制 3000 ms 記憶體限制 65535 kb 難度 5描述 南將軍率領著許多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1 n,由於交通不太便利,南將軍準備修路。現在已經知道哪些城市之間可以修路,如果修路,花費是多少。現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通起...

nyoj 118 修路方案

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍率領著許多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1 n,由於交通不太便利,南將軍準備修路。現在已經知道哪些城市之間可以修路,如果修路,花費是多少。現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通...