修路方案(次小生成樹)

2021-07-03 18:09:52 字數 1753 閱讀 3988

時間限制:

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題目改編

上傳者張云聰

沒看懂次小生成樹,仿照別人的**自己寫了乙個,以後就仿照這個模板寫,直到自

己領悟為止!

#include#include#includeconst int infinity=0x3f3f3f3f;

const int maxnum=505;

using namespace std;

int nodenum;

int map1[maxnum][maxnum],visited[maxnum],low[maxnum];//最小生成樹基本變數

int mmax[maxnum][maxnum],pre[maxnum],connect[maxnum][maxnum];//次小生成樹必須變數

void prim()

low[pos]=0;

visited[pos]=1;//把1號作為起點

for(i=2;i<=nodenum;i++)//這個i沒有其他的意思就是乙個迴圈次數

}if(pos==-1)

visited[pos]=1;//做到與1os號最近的邊

result+=min;//加權值

fa=pre[pos];//*****取得這個點的前節點*****

connect[fa][pos]=connect[pos][fa]=0;//*****讓前節點與當前點不是聯通的!

mmax[fa][pos]=min;//*****設定前點與當前點的距離為min*****

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

}//*****以下為次小生成樹新增*****

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

//*****以上為次小生成樹新增*****

}return ;

}int main()

}把這個替換成上面那個就wa了不知道為什麼,以後注意一點!

*/memset(connect,0,sizeof(connect));//*****

cin>>nodenum>>m;

while(m--)

{cin>>a>>b>>c;

if(c

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

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

nyoj118 修路方案 次小生成樹

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

最小生成樹(修路)

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