HDU 3371 Connect the Cities

来源:互联网 发布:java按键监听器 编辑:程序博客网 时间:2024/06/10 01:48
Problem Description
In 2100, since the sea level rise, most of the cities disappear. Though some survived cities are still connected with others, but most of them become disconnected. The government wants to build some roads to connect all of these cities again, but they don’t want to take too much money.  
 

Input
The first line contains the number of test cases.
Each test case starts with three integers: n, m and k. n (3 <= n <=500) stands for the number of survived cities, m (0 <= m <= 25000) stands for the number of roads you can choose to connect the cities and k (0 <= k <= 100) stands for the number of still connected cities.
To make it easy, the cities are signed from 1 to n.
Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q.
Then follow k lines, each line starts with an integer t (2 <= t <= n) stands for the number of this connected cities. Then t integers follow stands for the id of these cities.
 

Output
For each case, output the least money you need to take, if it’s impossible, just output -1.
 

Sample Input
16 4 31 4 22 6 12 3 53 4 332 1 22 1 33 4 5 6
 

Sample Output
1

题意:给你n m k; 最小生成树的经典输入,k的意思代表给定有k条路已经连通了。现在要你求出连通所有路的最小价值

思路:最小生成树的变形,只要用并查集把已经连通的点放到一起就可以了,再最小生成树算法

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,cnt;int f[520];int flag[520];#define N 25005struct node{    int u,v,w;}num[N];bool cmp(node x,node y){    return x.w<y.w;}int find(int x){    if(x!=f[x])        f[x]=find(f[x]);    return f[x];}int kruscal(){    int x,y,i;    //int dian=n;    int sum=0;    for(i=0;i<cnt;i++)    {        x=find(num[i].u);        y=find(num[i].v);        if(x==y)            continue;        sum+=num[i].w;        f[x]=y;        flag[num[i].u]=1;        flag[num[i].v]=1;      /*  dian--;        if(dian==0)            break;*/    }  /*  if(i==cnt)        return -1;*/ //   else        return sum;}int main(){    int k,i,j,sum;    int t;    scanf("%d",&t);    while(t--)    {        cnt=0;        scanf("%d %d %d",&n,&m,&k);        memset(flag,0,sizeof(int)*(n+2));        for(i=0;i<=n;i++)            f[i]=i;        for(i=0;i<m;i++)        {            int a,b,c;            scanf("%d %d %d",&a,&b,&c);            num[cnt].u=a;            num[cnt].v=b;            num[cnt++].w=c;        }        sort(num,num+cnt,cmp);        for(i=0;i<k;i++)        {            int a,b;            int test;            scanf("%d",&test);            scanf("%d",&a);            flag[a]=1;            for(j=1;j<test;j++)            {                scanf("%d",&b);                flag[b]=1;                int x=find(a);                int y=find(b);                if(x!=y)                    f[x]=y;            }        }        sum=kruscal();        for(i=1;i<=n;i++)            if(!flag[i])                break;        if(i<=n)            printf("-1\n");        else            printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 后跟贴粘在鞋上怎么办 优化营商环境公安怎么办 提升营商环境公安怎么办 准予迁入证明过期了怎么办 粉底液容易脱妆怎么办 家人进了火疗传销怎么办 自发热护膝洗了怎么办 用气垫bb卡粉怎么办 贴药膏后皮肤过敏红肿怎么办 贴完膏药皮肤痒怎么办 猕猴桃吃的嘴疼怎么办 摩拜单车怎么办月卡 出国忘了带护照怎么办 雅漾喷雾失压了怎么办 洗衣服时衣服粘上卫生纸怎么办 一晚上卫生巾都是满的怎么办 宝宝头上痱子痒怎么办 短裤里的宽松紧带拧了怎么办 肉色内衣被染黑色了怎么办 安全裤总往上缩怎么办 夏天穿裙子膝盖怕凉怎么办 夏天穿裙子膝盖冷怎么办 天凉嗓子痒咳嗽怎么办 棉服里面跑毛怎么办 棉衣里面的棉一块一块的怎么办 穿姨妈巾悟出痱子怎么办 穿裙子上衣太长了怎么办 微信封号了零钱怎么办 快递加盟商欠我工资怎么办 加盟费交了以后怎么办 加盟总部违约加盟商该怎么办 自行车锁钥匙丢了怎么办 假体隆胸肿胀痛怎么办 恶露60天不干净怎么办 剖腹产俩月恶露不干净怎么办 剖腹产恶露一个多月还没干净怎么办 小月子全身流虚汗怎么办 生完孩子严重便秘怎么办啊 产后第5天恶露少怎么办 有恶露排不出来怎么办 刚生完小孩便秘怎么办