最小权值和

来源:互联网 发布:versions for mac 编辑:程序博客网 时间:2024/05/04 23:26

题意:第一行给出m,n。接下来m行每行三个数u v s表示从u到v的权值。算出把n个数连起来权值最小的值‘

思路:krustal算法,照着模板就行,注意讨论根是否走过,总之不太熟。

感悟:真是一点小错误也不敢有啊。

AC代码:

#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;int bin[10010];struct p{    int s;    int e;    int v;}q[100010];bool flag[10010];bool cmp(p a,p b){    return a.v>b.v;}int find(int x){    if(x!=bin[x])      bin[x]=find(bin[x]);   return bin[x];}int main(){    int n,m,i,x,y;    while(scanf("%d%d",&n,&m),n|m)    {        for(i=0;i<m;i++)            scanf("%d%d%d",&q[i].s,&q[i].e,&q[i].v);            sort(q,q+m,cmp);            int res=0;            for(i=0;i<n;i++)            bin[i]=i,flag[i]=false;            for(i=0;i<m;i++)            {                x=find(q[i].s);                y=find(q[i].e);                if(x!=y){                    if(!flag[x]&&!flag[y]){                bin[x]=y;                res+=q[i].v;                }                else if(!flag[x]||!flag[y]){                bin[x]=y;                res+=q[i].v;                flag[x]=flag[y]=true;                }                }            else{            if(!flag[x]){                flag[x]=true;                res+=q[i].v;            }          }            }            printf("%d\n",res);    }    return 0;}

1 0
原创粉丝点击