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