1090. Highways

本文详细介绍了使用Kruskal算法求解最小生成树的过程,并解释了为何可以通过该算法找到图中边的最大权重来确定最小生成树。通过具体的代码示例说明了如何实现Kruskal算法。

TAG 最小生成树 Kruskal

用Kruskal求最小生成树,最后加入的边的长度就是结果。

证明一下为什么可以这么求。

题目要求图要连通,可以有环,且最长边最小。

Kruskal保证图是连通无环的,且全部的边的和最小。

题目允许有环,而在进行Kruskal时那些会形成环的边会被丢弃,但其长度小于等于最后加入的边的长度,对结果无影响。并且Kruskal求解的基础就是“用小的边能保证最终生成的边的和最小”(具体证明参见Kruskal算法),所以能满足最后加入的边长度是最小。

囧。又Presentation error了。。有些在每个case之后空行,有些只能在case之间空行。。

/* source code of submission 431637, Zhongshan University Online Judge System */ #include <stdio.h> #include <algorithm> using namespace std; struct node { int v,u,dist; bool operator<(const node &y)const { return dist<y.dist; } }; node edge[500*499/2]; int nedge; int n,m,t; int tmp,ans; int par[500]; int find(int x) { if ( x==par[x] ) { return x; } else { par[x]=find(par[x]); return par[x]; } } int main(int argc, char *argv[]) { scanf("%d", &t); while ( t-- ) { nedge=-1; scanf("%d", &n); for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { scanf("%d", &tmp); if ( j>i ) { ++nedge; edge[nedge].v=i; edge[nedge].u=j; edge[nedge].dist=tmp; } } } sort(edge, edge+nedge+1); for (int i=0; i<n; ++i) { par[i]=i; } m=0; ans=0; for (int i=0; i<=nedge; ++i) { if ( find( edge[i].v) != find(edge[i].u) ) { ++m; ans=edge[i].dist; par[ find(edge[i].v) ]=par[ edge[i].u ]; if ( m==(n-1) ) { break; } } } printf("%d/n",ans ); if ( t!=0 ) { printf("/n"); } } return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值