题意:和第四题差不多就是在第三个数后再加一个数1表示没联通0表示联通。
思路:结构体里加一个表示是否连通的变量,在主函数排序之前加一个if函数判断如果是1了两村之间的权值赋值为0.
感悟:要一点一点的积累以前学过的知识,总之能在前一道的基础上很快的做出来我还是挺开心的
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1005;
int father[N];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
struct edge{
int x,y,v,a;
}e[N*(N-1)/2];
int cmp(edge e1,edge e2)
{
return e1.v<e2.v;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
father[i]=i;
n=n*(n-1)/2;
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].v,&e[i].a);
if(e[i].a==1)
{
e[i].v=0;
}
}
sort(e,e+n,cmp);
int res=0;
for(int i=0;i<n;i++)
{
int x=find(e[i].x);
int y=find(e[i].y);
if(x!=y)
{
res+=e[i].v;
father[x]=y;
}
}
printf("%d\n",res);
}
return 0;
}
。
AC代码: