题意大意:
给出N人,以下N行表示所交朋友,0结束
把这些人划分为两个team,team成员必须至少有一个朋友在另一个team
题解:
每个人有两个标记量,记录是否有朋友在teamA,在teamB;
从头检索
若teamA为false,则把自己放到teamA,标记朋友圈的teamA为true,表示有朋友在teamA
否则
若teamB为false,把自己放到teamB,标记朋友圈的teamB为true,表示有朋友在teamB
否则
说明teamA和teamB都为true,则该人放在teamA或teamB都可以,可不做处理
1 // 2 /* 3 4 */ 5 #include <cstdio> 6 7 8 #define N 101 9 10 bool flag[N][2]; 11 int fri[N][N]; 12 int ans [N]; 13 int ansc; 14 15 int main() 16 { 17 int n; 18 while(scanf("%d",&n)!=EOF) 19 { 20 ansc = 0; 21 for (int i=0;i<n;i++) 22 { 23 ans[i] = 0; 24 flag[i][0] = false; 25 flag[i][1] = false; 26 int j=0; 27 do 28 { 29 scanf("%d",&fri[i][j]); 30 fri[i][j]--; 31 }while(fri[i][j++]!=-1); 32 } 33 ans[n] = 0; 34 for (int i=0;i<n;i++) 35 { 36 if (flag[i][0]==false) 37 { 38 ans[ansc++] = i+1; 39 int j=0; 40 do 41 { 42 flag[fri[i][j]][0] = true; 43 }while(fri[i][j++]!=-1); 44 } else 45 { 46 if (flag[i][1]==false) 47 { 48 int j=0; 49 do 50 { 51 flag[fri[i][j]][1] = true; 52 }while(fri[i][j++]!=-1); 53 } 54 } 55 } 56 printf("%d\n%d",ansc,ans[0]); 57 for (int i=1;i<ansc;i++) 58 { 59 printf(" %d",ans[i]); 60 } 61 printf("\n"); 62 } 63 return 0; 64 }
By fenrir1205