nyoj 118 修路方案

2021-08-19 03:43:22 字數 1705 閱讀 1191

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:5

描述

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

現在已經知道哪些城市之間可以修路,如果修路,花費是多少。

現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通起來,而且花費最少。

但是,南將軍說,這個修路方案所拼成的圖案很不吉利,想讓小工計算一下是否存在另外一種方案花費和剛才的方案一樣,現在你來幫小工寫乙個程式算一下吧。

輸入

第一行輸入乙個整數t(1每組測試資料的第一行是兩個整數v,e,(3隨後的e行,每行有三個數字a b l,表示a號城市與b號城市之間修路花費為l。

輸出

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

樣例輸入

23 3

1 2 1

2 3 2

3 1 3

4 41 2 2

2 3 2

3 4 2

4 1 2

樣例輸出

noyes

#include#include#include#include#includeusing namespace std;

#define maxv 510

#define maxe 200005

struct edge

;edge edge[maxe],edge1[maxe]; //分別是邊陣列 最小生成樹中的邊陣列

int father[maxv],num[maxv],num,dex,dey; //並查集 num統計生成樹邊的條數 dex dey指列舉刪除邊的x,y座標

void init(int v) //並查集初始化,單個元素自成集合

}int findfather(int x) //尋找父結點,可以壓縮路徑。。

void union(int x,int y)

else }

int comp(const void* p1,const void* p2)

int krusual(int v,int e)

} return sum;

}int akrusual(int v,int e)

if(edge[k].x==dey&&edge[k].x==dex)

sum+=edge[k].dis;

union(edge[k].x,edge[k].y);

}} return sum;

}bool judge(int v) //判斷圖是否連通,不連通則無法構造最小生成樹

int main()

qsort(edge+1,e,sizeof(edge[1]),comp);

init(v);

int sum=krusual(v,e);

int m=1000,temp;

for(int q=1;q<=num;++q)

if(m==sum) printf("yes\n");

else printf("no\n");

}}

NYOJ 118 修路方案

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

NYOJ 118 修路方案

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

nyoj118 修路方案 次小生成樹

如果已知最小生成樹,將未在生成樹的一條路徑加入生成樹必會產生乙個環,刪除環中除剛新增的一條以外的最大邊剩下的就是次小生成樹.求最小生成樹時用maxd陣列儲存兩點間最大的一條邊刪除時使用.include define inf 0x3f3f3f3f using namespace std const i...