度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。
哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。
所以这一场战争,将会十分艰难。
为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。
第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。
哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。
现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战争的顺利进行。
请问最少应该付出多少的代价。
本题包含若干组测试数据。
第一行两个整数n,m,表示有n个将领,m个关系。
接下来m行,每行三个整数u,v,w。表示u将领和v将领之间存在一个强关系,摧毁这个强关系需要代价w
数据范围:
2<=n<=3000
1<=m<=100000
1<=u,v<=n
1<=w<=1000
对于每组测试数据,输出最小需要的代价。
2 1
1 2 1
3 3
1 2 5
1 2 4
2 3 3
1
3
首先我们要读清楚题意,大概题意是:一幅图里面,有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形成一个图),这并不符合题意。题目要求是分离出一个孤立点。
尽管题意可能比较模糊,但还是强调题目要求是分离出一个孤立点,题目要求是分离出一个孤立点,题目要求是分离出一个孤立点。嘿嘿,重要的事情说三遍。
#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]);
}
}