zoukankan      html  css  js  c++  java
  • HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】

    链接6081
    度度熊的王国战略
    Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 32768/132768 K (Java/Others)
    Total Submission(s): 923 Accepted Submission(s): 352

    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

    Source
    2017"百度之星"程序设计大赛 - 资格赛

    【水法】

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e5+5;
    const int INF=1<<30;
    int sum[N];
    
    int main()
    {
    	int n,m;
    	while(cin>>n>>m)
    	{
    		memset(sum,0,sizeof(sum));
    		int a,b,w;
    		while(m--)
    		{
    			cin>>a>>b>>w;
    			if(a==b) continue;//
    			sum[a]+=w;
    			sum[b]+=w;
    		}
    		sort(sum+1,sum+n+1);
    		cout<<sum[1]<<endl;
    	}
    } 
    

    【并查集】

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e5+5;
    const int INF=1<<30;
    int sum[N];
    int fa[N];
    int n,m;
    int a,b,w;
    void init()
    {
    	for(int i=0;i<=n;i++)
    		fa[i]=i;
    }
    int Find(int x)
    {
    	return fa[x] = fa[x] == x ? x : Find(fa[x]);
    }
    void join(int x,int y)
    {
    	int fx = Find(x);
    	int fy = Find(y);
    	if(fx!=fy)
    		fa[fy]=fx;
    }
    int main()
    {
    	while(cin>>n>>m)
    	{
    		init();
    		int cnt = n-1;
    		memset(sum,0,sizeof(sum));
    		while(m--)
    		{
    			cin>>a>>b>>w;
    			if(a==b) continue;//
    			sum[a]+=w;
    			sum[b]+=w;
    			int fx = Find(a);
    			int fy = Find(b);
    			if(fx!=fy)
    			{
    				cnt--;
    				join(fx,fy);
    			}
    		}
    		if(!cnt){
    			sort(sum+1,sum+n+1);
    			cout<<sum[1]<<endl;
    		}else{
    			cout<<"0"<<endl;
    		}
    		
    	}
    } 
    
  • 相关阅读:
    哈密顿环求解 C++实现 回溯法
    哈密顿环求解 C++实现 回溯法
    哈密顿环求解 C++实现 回溯法
    图着色问题 配色方案 C++实现 回溯法
    图着色问题 配色方案 C++实现 回溯法
    图着色问题 配色方案 C++实现 回溯法
    图着色问题 配色方案 C++实现 回溯法
    n-皇后问题 C++实现 回溯法
    n-皇后问题 C++实现 回溯法
    如何给Sqlite添加复合主键
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9261451.html
Copyright © 2011-2022 走看看