练习四1005

来源:互联网 发布:在数据库中存储的是 编辑:程序博客网 时间:2024/05/02 05:50

题意:和第四题差不多就是在第三个数后再加一个数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代码:

0 0
原创粉丝点击