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
Sample Input 2 1 1 2 1 3 3 1 2 5 1 2 4 2 3 3 Sample Output 1 3
题意:
给出一个图,破坏图中的某些边,将一个点分离出去。破坏每条边的代价是与这个点相连的边的权值和,问要将此图中的任意一点分离出去,最小代价是多少。(语言表达有点问题,凑合看吧)
思路:
这才是真正的签到题,不过出题率有点低,估计很多dalao们直接去做DP,做完之后就没看别的,然后后面的看到DP出题率最高,出题数也最多就直接去搞DP了,然后都忽略了这个大水题。 明确题意之后就特别简单了,直接定义一个数组记录与每个点相连的边的权值和,然后遍历找最小就行了。
我猜坑点在是重边情况,如果是有重边的话,必须两条边都破坏才能分离出这个点,所以重边是需要重复计算的。还有可能就是对题意理解不太明确,要求是一个点孤立,并不是将图分成两个部分。比如1和2之间权值是10,2和3之间权值是5,3和4之间权值是10,那么最小代价应该是10,将第一个点或者最后一个点分离出去,并不是把2和3之间那条边破坏。
可能出题率低在这里吧。其他是真的没有什么坑。代码也超级简单。
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <string.h> using namespace std; int main() { int m,n; int sum[10000]; while(~scanf("%d%d",&n,&m)) { memset(sum,0,sizeof(sum)); for(int i=1; i<=m; i++) { int a,b,c; cin>>a>>b>>c; if(a==b) continue; sum[a]+=c,sum[b]+=c; } sort(sum+1, sum+n+1); cout<<sum[1]<<endl; } return 0; }