您的位置:首页 > 其它

ZOJ1542 POJ1861

2013-07-29 15:13 197 查看
题意:给你N个点M条边,求最小生成树,并且输出最小生成树里最大的那条边,并且输出路径

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define N 1005
#define M 15005
int father
,rank
,n,m,sum,MAX,num;
int NUM
;
struct Edge
{
int u;
int v;
int w;
}edge[M];

bool cmp(Edge a,Edge b)
{
return a.w < b.w ;
}

void Init()
{
for(int i=0; i<=n; i++)
{
father[i] = i;
rank[i] = 1;
}
}

int find(int x)
{
if(father[x] != x)
{
father[x] = find(father[x]);
}
return father[x] ;
}

void merge(int x,int y)
{
int xf = find(x);
int yf = find(y);
if(rank[xf] > rank[yf])
{
rank[xf] += rank[yf];
father[yf] = xf;
}
else
{
rank[yf] += rank[xf];
father[xf] = yf;
}
}

void Kruskal()
{
num = 0;
MAX=0;
for(int i=0; i<m; i++)
{
int u = edge[i].u;
int v = edge[i].v;
if(find(u) != find(v))
{
NUM[num] = i;
num++ ;
sum += edge[i].w;
MAX = max(MAX,edge[i].w);
merge(u,v);
}
if(num == n-1) break;
}
}

int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
Init();
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort(edge,edge+m,cmp);
sum = 0;
Kruskal();
printf("%d\n",MAX);
printf("%d\n",num);
for(int i=0; i<num; i++)
{
printf("%d %d\n",edge[NUM[i]].u,edge[NUM[i]].v);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: