修复公路
最小生成树水题 不过有很多细节需要注意
思路
把边按费用(时间?)p排序
从小到大连边
如果连完边后还不联通
则无方案
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=100001;
struct node {int start,time,end;}line[Maxn];
int n,m,x,y,t,tot,ans,cnt,fa[Maxn];
int comp(const node &a,const node &b){return a.time>b.time?0:1;}
int find(int x){return (x==fa[x])?x:find(fa[x]);}
int pd()//检查是否连通
{
int x=find(2);
for(int i=1;i<=n;i++)if(find(i)!=x)return 1;
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){scanf("%d%d%d",&line[i].start,&line[i].end,&line[i].time);}
sort(line+1,line+m+1,comp);
for(int i=1;i<=m;i++)
{
int r1=find(line[i].start);int r2=find(line[i].end);
if(r1!=r2)
{
ans=max(ans,line[i].time);
fa[r1]=r2;
}
}
for(int i=1;i<=n;i++)if(fa[i]==i)cnt++;
if(pd())printf("-1");
else printf("%d",ans);
}
欢迎指出
Bug
End。