hdu 1233 kruskal + 并查集

来源:互联网 发布:带着淘宝去古代txt 编辑:程序博客网 时间:2024/06/02 04:51
//构建的图为无向图#include <iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxe=5000+5;              //最大边数const int maxv=100+5;           //最大顶点数int n;          //n为最小生成树中的顶点struct Edge{int from,to;int weight;};bool operator<(const Edge&E1,const Edge&E2){    return E1.weight<E2.weight;}Edge edges[maxe];int vset[maxv];int e;          //构成最小生成树所需要的边数int Getparent(int i){    if(i!=vset[i])        vset[i]=Getparent(vset[i]);    return vset[i];}void kruskal(int num)           //从num条路径中选取e条路径完成生成树{    int sum=0;    for(int j=1;j<=num;j++)    {        int p1=Getparent(edges[j].from);        int p2=Getparent(edges[j].to);        if(p1!=p2) {                         sum+=edges[j].weight;                         vset[p2]=p1;                         e--;                          }    }    cout<<sum<<endl;}int main(){    while(scanf("%d",&n)==1&&n)    {        e=n-1;        for(int i=1;i<=n;i++)           //使用并查集             vset[i]=i;        int num=(n*(n-1))/2;        for(int i=1;i<=num;i++)        {            int v1,v2,dist;            scanf("%d%d%d",&v1,&v2,&dist);            edges[i].from=v1;            edges[i].to=v2;            edges[i].weight=dist;        }        sort(edges,edges+num+1);        kruskal(num);    }    return 0;}
原创粉丝点击