您的位置:首页 > 其它

最小生成树之kruskal

2016-06-27 19:00 204 查看
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

const int maxx = 102;

typedef struct Road{
int x;
int y;
int cost;
}Road;

int pre[maxx],cnt,res;
Road road[maxx*maxx+1];

void init(int n){
int i;
for(i=1;i<=n;++i){
pre[i]=i;
}
}

int root(int x)
{
return pre[x]==x?x:root(pre[x]);
}

int merge(int x,int y){
int fa = root(x);
int fb = root(y);
int ret = 0;
if(fa!=fb){
--cnt;
pre[fa] = fb;
ret = 1;
}
return ret;
}

int cmp(struct Road a,struct Road b){

return a.cost<b.cost;

}

int main(){
int n,m,i,flg;

while(scanf("%d %d",&n,&m) && n!=0){

init(m);
cnt = m-1;
res = 0;

for(i=0;i<n;++i){
scanf("%d %d %d",&road[i].x,&road[i].y,&road[i].cost);
}

sort(road,road+n,cmp);

for(i=0;i<n;++i){
flg = merge(road[i].x,road[i].y);
if(flg==1){
res += road[i].cost;
}
}
if(cnt!=0){
printf("?\n");
}else{
printf("%d\n",res);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: