【2017"百度之星"程序设计大赛

来源:互联网 发布:淘宝旺铺店招代码 编辑:程序博客网 时间:2024/05/17 10:38

【链接】:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=774

【题目】:

度度熊的王国战略

 
 Accepts: 120
 
 Submissions: 2475
 Time Limit: 20000/10000 MS (Java/Others)
 
 Memory Limit: 32768/132768 K (Java/Others)
Problem Description

度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。

哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。

所以这一场战争,将会十分艰难。

为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。

第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。

哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。

现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战争的顺利进行。

请问最少应该付出多少的代价。

Input

本题包含若干组测试数据。

第一行两个整数n,m,表示有n个将领,m个关系。

接下来m行,每行三个整数u,v,w。表示u将领和v将领之间存在一个强关系,摧毁这个强关系需要代价w

数据范围:

2<=n<=3000

1<=m<=100000

1<=u,v<=n

1<=w<=1000

Output

对于每组测试数据,输出最小需要的代价。

Sample Input
2 11 2 13 31 2 51 2 42 3 3
Sample Output
13
【思路】模板题,用并查集判断一下联通条件就可以了。

【代码】:

/* ***********************************************Author        :herongweiCreated Time  :Sat 5 Aug 2017 17:50:23 PM CSTFile Name     :1002.cpp************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;typedef long long LL;const int maxn  = 3333;const int MOD   = 1e9+7;const LL inf   = 0x3f3f3f3f;const double eps= 1e-8;const double pi = acos(-1.0);int n,m,t,tot,cnt,ret,ans,tmp;inline int read(){    int  c=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar(); }    while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}    return c*f;}int fa[maxn],du[maxn];int find(int x)//{    if(x==fa[x]) return x;    return fa[x]=find(fa[x]);}void init(){    for(int i=1; i<=n; ++i) fa[i]=i,du[i]=0;}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d%d",&n,&m))    {        init();        tot=0;//不连通        for(int i=1; i<=m; ++i)        {            int u,v,w;            u=read();v=read();w=read();            if(u==v) continue;            du[u]+=w;            du[v]+=w;            if(find(u)!=find(v))            {                ++tot;               // fa[u]=fa[v];               fa[find(u)]=find(v);            }        }        if(tot!=n-1)//图本身不连通        {            puts("0");            continue;        }        ret=du[1];        for(int i=2; i<=n; ++i) ret=min(du[i],ret);        printf("%d\n",ret);    }    return 0;}


原创粉丝点击