Timus 1080. Map Colouring

Timus 1080. Map Colouring

无聊的写了一个水题,发现 Timus 的题目很好玩啊

判断一个图是不是二分图。bfs 染色即可。

 1  #include < stdio.h >
 2  #include < iostream >
 3  #include < string .h >
 4  #include < queue >
 5  #include < vector >
 6  #define  N 108
 7  #define  inf 0x3ffffff
 8  using   namespace  std;
 9  vector < int > g[N];
10  int  clor[N];
11  int  n;
12  int  bfs( int  s)
13  {
14      queue < int > q;
15      q.push(s);
16      clor[s] = 0 ;
17       while ( ! q.empty())
18      {
19           int  p = q.front(); q.pop();
20           for ( int  i = 0 ;i < g[p].size();i ++ )
21          {
22               if (clor[g[p][i]] ==- 1 )
23              {
24                  clor[g[p][i]] = 1 - clor[p];
25                  q.push(g[p][i]);
26              }
27               else   if (clor[g[p][i]] != 1 - clor[p])  return   0 ;
28          }
29      }
30       return   1 ;
31  }
32      
33  int  main()
34  {
35       while (scanf( " %d " , & n) != EOF)
36      {
37           for ( int  i = 0 ;i <= n;i ++ ) g[i].clear();
38           for ( int  i = 0 ;i < n;i ++ )
39          {
40               int  k;
41               while (scanf( " %d " , & k),k)
42              {
43                  g[i].push_back(k - 1 );
44                  g[k - 1 ].push_back(i);
45              }
46          }
47          memset(clor, - 1 , sizeof (clor));
48           int  i;
49           for (i = 0 ;i < n;i ++ )
50           if (clor[i] ==- 1 if (bfs(i) == 0 break ;
51           if (i < n) puts( " -1 " );
52           else   for ( int  i = 0 ;i < n;i ++ )printf(i == n - 1 ? " %d\n " : " %d " ,clor[i]);
53      }
54       return   0 ;
55  }


你可能感兴趣的:(Timus 1080. Map Colouring)