poj1861 kruskal

简介: http://poj.org/problem?id=1861 #include<cstdio> #include<algorithm> #include<cstdlib> using namespace std; #define maxn 1001 #define maxm 15001 struct edge { int u,v

http://poj.org/problem?id=1861

#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define maxn 1001
#define maxm 15001
struct edge
{
    int u,v,w;
} edges[maxm];
int parent[maxn],ans[maxn];
int i,j,N,M;
int maxedge,num,ai;
void ufset()
{
    for(i=0; i<N; i++)
        parent[i]=-1;
}
int find(int x)
{
    int s;
    for(s=x; parent[s]>=0; s=parent[s]);
    while(s!=x)
    {
        int tmp=parent[x];
        parent[x]=s;
        x=tmp;
    }
    return s;
}
void Union(int R1,int R2)
{
    int r1=find(R1),r2=find(R2);
    int tmp=parent[r1]+parent[r2];
    if(parent[r1]>parent[r2])
    {
        parent[r1]=r2;
        parent[r2]=tmp;
    }
    else
    {
        parent[r2]=r1;
        parent[r1]=tmp;
    }
}
int cmp(const void* a,const void* b)
{
    edge aa=*(const edge*)a;
    edge bb=*(const edge*)b;
    return aa.w-bb.w;
}
void kruskal()
{
    int u,v;
    ufset();
    for(i=0; i<M; i++)
    {
        u=edges[i].u;
        v=edges[i].v;
        if(find(u)!=find(v))
        {
            ans[ai++]=i;
            if(edges[i].w>maxedge)
                maxedge=edges[i].w;
            num++;
            Union(u,v);
        }
        if(num>N-1)
            break;
    }
}
int main()
{
    //freopen("1.txt","r",stdin);
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        for(i=0; i<M; i++)
            scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
        qsort(edges,M,sizeof(edges[0]),cmp);
        maxedge=0;  num=0;
        kruskal();
        printf("%d\n%d\n",maxedge,num);
        for(i=0; i<num; i++)
            printf("%d %d\n",edges[ans[i]].u,edges[ans[i]].v);
    }
    return 0;
}

  

目录
相关文章
|
人工智能 机器学习/深度学习
POJ 1067 取石子游戏
取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40917   Accepted: 13826 Description 有两堆石子,数量任意,可以不同。
1124 0
|
测试技术
poj-1218 THE DRUNK JAILER 喝醉的狱卒
自己去看看原题; 题目大意: 就是一个狱卒喝醉了,他第一趟吧所有的监狱都带开,第二趟把能把二整除的监狱关闭,第三趟操作能把三整除的监狱; 求最后能逃跑的罪犯数 输入第一个数是代表 测试数据组数 每个数据代表狱卒来回的次数 当作开关问题即可 #include using names...
1018 0
|
机器学习/深度学习

热门文章

最新文章