在战火纷乱的古代有许多小国家。在这些小国家中,就会有一些强大的,一些弱小的。势力大的就会吞并势力小的,
形成更大的势力国家。现在给出你一些目前的国家势力关系,你能预算出以后的局势吗?
为了简化问题,给每个国家编号,像“国家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