Description
通灵人大战(Shaman Fight)已经在新世纪演变成了诸神的战争--玉米之花(Flower Of Maize),为了守护当今的通灵王,麻仓花决定在2个通灵军团当中挑选自己的队友进行战斗.这2个通灵军团各有N个通灵者,但是这2个军团间经常发生战斗,所以他们之中某些人存在矛盾关系,不过同一军团内并不存在矛盾.某两个通灵者之间存在矛盾关系即表示这两人无法在同一个队伍中共存,也就是发生内斗.为了让自己的队伍保持最高的战斗力,麻仓花决定挑选尽量多的通灵者加入自己的队伍,同时保证队伍里不发生内斗.
Input
对于每组测试数据,第一行输入两个整数N,M(1<=N<=15 , 0<=M<=N*N).接下来输入M行,每行输入两个整数a,b(1<=a , b<=N)表示军团一的a和军团二的b之间存在矛盾.数据保证两个人之间最多只存在一条矛盾关系.
Output
对于每组测试数,第一行输出最多的通灵者人数x.
接下来x行每行输出两个数,分别表示挑选出来的通灵者的军团编号以及该通灵者自身的编号.(按任意顺序输出,若存在多种答案,请输出任意一种)
Sample Input
3 5
1 1
1 2
1 3
2 1
3 1
3 3
1 3
2 1
3 2
Sample Output
4
1 2
2 2
1 3
2 3
3
2 1
2 2
2 3
参考代码如下:
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int>E[20];
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<=20;i++)
E[i].clear();
for(i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
E[a].push_back(b);
}
bool a[20],b[20];
memset(a,true,sizeof(a));
memset(b,true,sizeof(b));
for(i=1;i<=n;i++)
{
int le=E[i].size();
if(le>1)
a[i]=false;
else
{
for(int j=0;j<le;j++)
b[E[i][j]]=false;
}
}
int ans=0;
for(i=1;i<=n;i++)
{
if(a[i])
ans++;
if(b[i])
ans++;
}
printf("%d\n",ans);
for(i=1;i<=n;i++)
{
if(a[i])
printf("1 %d\n",i);
if(b[i])
printf("2 %d\n",i);
}
}
return 0;
}