時間限制:
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
分析:就是讓求次小生成樹的,**中有詳細的注釋,此處不多做分析了。
#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
int v,e;
int s[1005][1005],use1[1005][1005],maxn[1005][1005];
int sum=0;
int prim()///求最小生成樹的過程
pre[1]=0;///將1的前驅節點設為0,因為他沒有前驅節點
for(int i=1;ilow[j])///如果該點沒有被使用過並且路徑能被更新
}sum+=min1;///將找到的最小生成樹的邊加到最小生成樹的總值裡
vis[bj]=1;///將找到的點標記
use1[bj][pre[bj]]=use1[pre[bj]][bj]=1;/**將構成最小生成樹的邊都標記一下,
待次小生成樹找邊的時候就不能找這些被標記的邊**/
for(int j=1;j<=v;j++)///更新}}
return sum;
}int sprim()///求次小生成樹}}
return ans;
}int main()
if(prim()==sprim())///判斷次小生成樹和最小生成樹的結果是否一樣
printf("yes\n");
else
printf("no\n");
}return 0;
}
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...