ural 1106 Two Teams

http://acm.timus.ru/problem.aspx?space=1&num=1106
题目大义,给出一些朋友关系,
问是不是可以分为两组,使每一个人在另一个组中都有朋友

思路:一个简单的搜索,按列从左往右,没列从上往下搜索,如果找到,则将j分到第1组,此列中的人分到第2组,
搜索过程中,并将已经找到的标记,往后不用再重复查找,如果某一列没有找到朋友关系,则不可分

View Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

#define MAX 110
int s[MAX][MAX],ans[MAX],flag,t[MAX];

int fun(int N)
{
int i,j,k;
for(i=1,j=0,k=0;i<=N;i++)
{
if(!t[i]) //如果已经找过,则不必再找了
{
flag=false; //flag标志没列是否能够找到至少一个为1的
for(j=1;j<=N;j++) //以纵列搜索,
{
if(s[i][j]) //若为1
{
flag=true; //标记1
t[j]=1; //说明第j个已经找过,
}
}
if(flag) //保存第1组的人员
{
ans[k++]=i;
}
else //若某一列没有一个为1的则,返回0
return 0;
}
}
return k;
}

int main()
{
int i,N,y,sum;
while(scanf("%d",&N)!=EOF&&N)
{
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));//全部清0
for(i=1;i<=N;i++)
{
while(scanf("%d",&y)!=EOF&&y)
s[i][y]=1; //是朋友了标志为1
}
if(sum=fun(N))
{
printf("%d\n",sum);
printf("%d",ans[0]);
for(i=1;i<sum;i++)
printf(" %d",ans[i]);
printf("\n");
}
else //不满足要求的
printf("0\n");
}
return 0;
}



你可能感兴趣的:(r)