2020 年百度之星·程序设计大赛 - 测试赛 度度熊的王国战略 (签到题)

2020 年百度之星·程序设计大赛 - 测试赛 度度熊的王国战略 (签到题)

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 1
1 2 1
3 3
1 2 5
1 2 4
2 3 3

Sample Output

1
3

Solution

首先我们要读清楚题意,大概题意是:一幅图里面,有n点,有m条边,边的权值为w。我们需要做的,就是清除某条边(也可能是几条边),使得图中存在一个孤立点,清除边的代价就是边的权值和,题目要求代价最小。我们可以采取贪心的思想,分别对图中每个点求与该点有连接的边的权值和(若存在自环就不要计算在内),进行排序,输出最小的权值即可。

即在图中分离出一个孤立点来就可以了,如果图中原本就存在孤立点,显然代价为0.

该题唯一比较坑的地方就是:假设点1与点2相连,边权为5;点2与点3相连,边权为1;假设点3与点4相连,边权为5。那么在这种情况下,我们选择的是去掉点1与点2的边(或者去掉点3与点4的边),因为这样就会生成孤立点点1(点4)。尽管点3与点4的所连边的权值为1,但是如果去掉的话,就会生成两个不连通的子图(1与2形成一个图、3与4形成一个图),这并不符合题意。题目要求是分离出一个孤立点

尽管题意可能比较模糊,但还是强调题目要求是分离出一个孤立点题目要求是分离出一个孤立点题目要求是分离出一个孤立点。嘿嘿,重要的事情说三遍。

Code

#include 
#include 
#include 
#include 
using namespace std;

const int N=4000;
int n,m;
int sum[N];
int u,v,w;

int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    while(~scanf("%d%d",&n,&m))
    {
        memset(sum,0,sizeof(sum));
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            if(u==v)continue; //注意自环不算入
            sum[u]+=w;
            sum[v]+=w;
        }
        sort(sum+1,sum+1+n);
        printf("%d\n",sum[1]);
    }

}

你可能感兴趣的:(算法之路,图论,c++,程序设计)