1.Question:
输入:
第一行两个数字,第一个n
代表是点数,第二个m代表边数
之后的m行代表有m个边,前两个代表两个点,第三个数字代表权重
输出:
MST中最大的边
边的个数(n-1)
将边集列出来
2.Solution:
标准的套模板,1861的题目的标准样例有一些问题,但是不应向我们做题,毕竟是Special Judge
3.Code:
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#include"algorithm"
#define N 20000
using namespace std;
typedef struct node
{
int x;
int y;
int weight;
}point;
point edge[N];
int number_of_point;
int number_of_edge;
int fa[N];
int deep[N];
bool book[N]; //记录那个边被选择
void init()
{
for(int i=0;i<=number_of_point;i++) fa[i]=i,deep[i]=0;
}
int find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void unit(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
else
{
if(deep[x]>deep[y]) fa[y]=x;
else
{
fa[x]=y;
if(deep[x]==deep[y]) deep[y]++;
}
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
bool cmp(point a,point b)
{
if(a.weight>b.weight) return false;
else return true;
}
int main()
{
int maxp=0;
cin>>number_of_point>>number_of_edge;
init();
for(int i=1;i<=number_of_edge;i++) cin>>edge[i].x>>edge[i].y>>edge[i].weight;
sort(edge+1,edge+number_of_edge+1,cmp);
int count=0;
for(int i=1;i<=number_of_edge;i++)
{
if(!same(edge[i].x,edge[i].y))
{
count++;
maxp=maxp>edge[i].weight?maxp:edge[i].weight;
book[i]=true;
unit(edge[i].x,edge[i].y);
}
if(count==number_of_point-1) break;
}
printf("%d\n%d\n",maxp,number_of_point-1);
for(int i=1;i<=number_of_edge;i++) if(book[i]) printf("%d %d\n",edge[i].x,edge[i].y);
return 0;
}