時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:5
描寫敘述
南將軍率領著很多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1~n。因為交通不太便利,南將軍準備修路。
如今已經知道哪些城市之間能夠修路。假設修路,花費是多少。
如今。軍師小工已經找到了一種修路的方案,可以使各個城市都聯通起來,並且花費最少。
可是。南將軍說,這個修路方案所拼成的圖案非常不吉利,想讓小工計算一下是否存在第二種方案花費和剛才的方案一樣,如今你來幫小工寫乙個程式算一下吧。
輸入
第一行輸入乙個整數t(1
輸出對於每組測試資料輸出yes或no(假設存在兩種以上的最小花費方案則輸出yes,假設最小花費的方案僅僅有一種,則輸出no)
例子輸入
23 31 2 1
2 3 2
3 1 3
4 41 2 2
2 3 2
3 4 2
4 1 2
例子輸出
noyes
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,由於交通不太便利,南將軍準備修路。現在已經知道哪些城市之間可以修路,如果修路,花費是多少。現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通...