Tạm hiểu:
Có n sinh viên, cần chia làm hai đội có số người bằng nhau, trong đó có những sinh viên có thù hằn với nhau, yêu cầu trong một đội không có hai sinh viên có thù hằn. Nếu một sinh viên không được vào đội nào thì phải ngồi trên ghế. Tính số sinh viên phải ngồi trên ghế.
Solution:
Sử dụng cấu trúc Disjoint set để giải quyết bài toán này, nếu hai thằng chung gốc và là lẻ thì chắc chắn sẽ bỏ đi 1 thằng. Sau đó nếu số sinh viên còn lại là số lẻ thì bỏ thêm 1 thằng nữa.
Code:
#include<iostream>
#include<cstdio>
using namespace std;
int N,M;
int p[101];
int e[101];
int res=0;
int FindSet(int x);
int main()
{
freopen("TEST.INP","r",stdin);
freopen("TEST.OUT","w",stdout);
cin >> N >> M;
for(int i=1;i<=N;i++) p[i]=i,e[i]=1;
int x,y;
for(int i=0;i<M;i++)
{
scanf("%d%d",&x,&y);
int px = FindSet(x),py=FindSet(y);
if((px==py)&&(e[py]&1))
res++;
p[px]=p[y];e[py]+=e[px];
}
if((N-res)%2!=0)
res++;
cout << res;
return 0;
}
int FindSet(int x)
{
if(x!=p[x])return FindSet(p[x]);
return x;
}
Không có nhận xét nào:
Đăng nhận xét