這個題就是最小生成樹演算法,倒是沒有異議,但是被自己坑了很多次qaq
自己摸出來以前的乙個模板直接對著敲上了,不細心把自己坑哭了
問題一:find函樹在找到祖先時 , 順便讓所有的節點都是祖先的直接兒子就好了,這樣能降低時間複雜度
問題二:判斷道路不夠的時候,既然所有的節點的直接爸爸都是祖先, 只要有乙個直接爸爸也就是f[2000]陣列中的任意乙個數和其他的不同就說明道路不夠不就行了?問題是不行,至於為啥我也很迷,那就每個節點都找找祖先 也就是把f陣列都一樣換成find函式都相同就完事了
這個板子超級好用,以後最小生成樹問題能套版這個絕對好使哈哈哈
//最小生成樹演算法模板題
#includeusing namespace std;
struct node
;node no[10000];//道路數目
bool cmp(node a, node b)
int f[10000];//儲存每個節點的最終父節點
int n,m;//城鎮數目以及候選道路數目
//初始化 一開始所有節點的爸爸都是自己
void init()
//找到祖先節點
int find(int x)
else
}//判斷一下兩個節點是不是在同一顆樹上,在一棵樹上就不能再連線了
bool same(int x, int y)
//兩顆樹連起來,這樣的話祖宗只能保留乙個
void mix(int x, int y)
//把邊從最短到最長排序,祖先一樣的邊扔了,不一樣的連就完事了
int croscer()
return res;
}int main()
init();
//求解答案
int ans = croscer();
//判斷是否全部聯通
bool flag = false;
int cnt = find(1);
for(int i = 2 ; i <= n ; i++)
}if(!flag)
printf("%d",ans);
else
printf("-1");
return 0;
}
7 11 公路村村通 30分
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入格式 輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。...
5 10 公路村村通 30分
5 10 公路村村通 30分 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n n le 1000 1 000 和候選道路數目m m le 3n 3 n 隨後的m m行對應m m條道路,每行給出3個正整...
5 9 公路村村通 30分
5 9 公路村村通 30分 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入格式 輸入資料報括城鎮數目正整數nn le 1000 1000 和候選道路數目mm le 3n 3n 隨後的mm行對應mm條道路,每行給出3個正整數,...