修路方案 最小生成樹變形 次小生成樹

2021-07-28 03:09:49 字數 1618 閱讀 2215

時間限制:

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

**poj題目改編

上傳者

張云聰模板題目

思路 演算法核心思想:在prime求mst的過程中 用陣列儲存mst裡面任意兩點間的唯一的路中 權值最大的那條邊的權值。最後列舉不在mst裡面的邊,判斷的權值 是否 和 mst裡面 i 到 j 的最大權值相等,只要有一條邊滿足就可以說明mst不唯一。(因為我們可以用這條不在mst的邊來 代替 在mst的邊,這樣mst肯定不唯一)

時間複雜度  citys*2

**:#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f  //  次小生成樹 

#define m 500+10

using namespace std;

int dis[m];

int map[m][m];

int v[m];  //以上的prime演算法 都有 

int mst[m][m];  //mst中i和j的最大邊權值 

int inmst[m][m]; //標記這個邊是不是在mst中 

int pre[m]; // 記錄前驅 

int citys,roads;

void getmap()

}for(int i=0;i

}void solve ()

v[1]=1;

for(int u=2;u<=citys;u++)

}sum+=min;

v[next]=1;

int fa=pre[next];// 獲得前驅 

inmst[fa][next]=inmst[next][fa]=1;  //在mst中 

for (int j=1;j<=citys;j++)}}

//  判斷mst是不是唯一的

for(int i=1;i<=citys;i++)}}

printf("no\n"); 

}int main()

return 0;}

修路方案(次小生成樹)

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

最小生成樹(修路)

題意 flatopia島要修路,這個島上有n個城市,要求修完路後,各城市之間可以相互到達,且修的總 路程最短.求所修路中的最長的路段 sample input 1 30 990 692 990 0 179 692 179 0 sample output 692 include define max ...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...