F - 势力较量

在战火纷乱的古代有许多小国家。在这些小国家中,就会有一些强大的,一些弱小的。势力大的就会吞并势力小的,

形成更大的势力国家。现在给出你一些目前的国家势力关系,你能预算出以后的局势吗?


为了简化问题,给每个国家编号,像“国家1”, “国家2”......“国家N”

国家的较量首先从人数上进行比较,人数多的能打赢人数少的。如果两个国家的人数相同,就根据国家头目的编号来判断,

我们假设编号大的国家能打得过编号小的国家。

当两个国家相遇的时候,就会有一场打斗,且一定要分出胜负,输的就会归顺于赢得, 形成一个新的国家。

Input多组测试数据,处理到文件结束。对于每组数据:
第一行两个整数N,M。N为国家个数,M为关系数目。
接下来M行,每行两个整数u, v。表示国家u,国家v相遇,有一场打斗。
然后试一个整数Q,表示Q个询问。
接下来Q行,每行一个整数S。
(N<100, M < 100, Q < 100)
OutputCase k:
对于每个询问,输出两个整数,
第一个整数表示S所在国家的头目,第二个整数表示S所在国家里边一共有多少个小国家。
Sample Input5 3
1 2
1 3
4 5
2
1
5


5 4
1 2
1 3
1 4
1 5
4
2
3
4
5
Sample OutputCase 1:
2 3
5 2
Case 2:
2 5
2 5
2 5

2 5

考虑的太少了。。//然后发现并不是考虑少了。。算法。。//未AC

#include<iostream>
using namespace std;

struct node{
	int num;
	int sum;
};

int cmp(node a,node b)
{
	if(a.sum==b.sum)
	{
		if(a.num>b.num) 
			return a.num;
		else
			return b.num;
	}
	else
	{
		if(a.sum>b.sum) 
			return a.num;
		else 
			return b.num;
	}	
}

int main()
{
	int s1[10000],s2[10000],b[10000],m,n,i,j,k,q;
	node a[10000];
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		a[i].num=i;
		a[i].sum=1;
	}
	for(i=0;i<m;i++)
	{
		cin>>s1[i]>>s2[i];//国家名 
	}
	cin>>q;
	for(i=0;i<q;i++)
	cin>>b[i];	
	for(i=0;i<m;i++)
	{
		if(s1[i]==cmp(a[s1[i]],a[s2[i]]))
		{
			a[s2[i]].num=a[s1[i]].num;
			a[s1[i]].sum+=a[s2[i]].sum;
			a[s2[i]].sum=a[s1[i]].sum;
		}
		else
		{
			a[s1[i]].num=a[s2[i]].num;	
			a[s2[i]].sum+=a[s1[i]].sum;
			a[s1[i]].sum=a[s2[i]].sum;
		
		}
	} 
	
	for(i=0;i<q;i++)
	cout<<a[b[i]].num<<" "<<a[b[i]].sum<<endl;
	return 0;
}

百度之后才知道是考察并查集,,,多学习吧,,,

#include<cstdio>  
using namespace std;  
const int MAX_N = 100+2;  
  
int par[MAX_N];  
// rank 数组存储 国家数   
int rank[MAX_N];  
int n, r, q;  
  
void init(int n){  
    for(int i =1; i<=n;i++){  
        par[i]  = i;  
        rank[i] = 1;  
    }  
}  
  
int find(int x){  
    if(par[x] == x)  
        return x;  
    else  
        return par[x] = find(par[x]);  
}  
  
// child := py    parent := px    
void unite(int x, int y){  
    int px = find(x);  
    int py = find(y);  
    if(px != py) {  
        par[py] = px;  
        //更新 国家数(***)   
        rank[px] += rank[py];  
          
    }  
}  
  
int main(){  
    int cas=1;  
    while(~scanf("%d%d",&n, &r)){  
      
        int x,y;  
        init(n);  
        while(r--){  
            scanf("%d%d",&x,&y);  
            // px py分别为 x y 所在国家头目; rank[px] rank[py] 为  x,y 所在国家 国家数   
            int px = find(x);  
            int py = find(y);   
            if(rank[px] > rank[py])   
            {  
                unite(px,py);  
            }  
            else if(rank[px] < rank[py])  
            {  
                unite(py,px);  
            }  
            else  
                {  
                    if(px > py)  
                        unite(px,py);  
                    else  
                        unite(py,px);  
                }  
        }  
          
        int k;  
        scanf("%d",&q);  
        printf("Case %d:\n",cas++);  
        for(int i =1; i<= q;i++){  
            scanf("%d",&k);  
            int pk = find(k);  
            printf("%d %d\n",pk, rank[pk]);  
        }     
      
      
    }  
    return 0;  
}  

//AC




猜你喜欢

转载自blog.csdn.net/qq_41333844/article/details/80212276
F