Why so serious? --[NKU]schindlerlee

秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。今天才知道原来这是写卫青的,李广就没去过龙城,偷袭龙城也是卫青干的。

2010年02月07日星期日.sgu172 判断一个图是否是二分图 黑白染色

2010年02月07日星期日.sgu172 判断一个图是否是二分图 黑白染色
题意解释:给出一个图的边,对这个图进行黑白染色,不能染色则输出no
能染色输出黑色或者白色的个数,并且输出点的序号
 1 
 2 const int N = 256;
 3 int g[N][N],n,m,vis[N];
 4 const int black = 1;
 5 const int white = 2;
 6 int res ;
 7 
 8 bool dfs(int u,int color)
 9 {
10   vis[u] = color;
11   if (color == black) { res++; }
12   if (color == black) { color = white; }
13   else { color = black; }
14 
15   int i;
16   for (i = 1;i <= n;i++) {
17       if (g[u][i]) {
18           if (vis[i] == 0) {
19               if(!dfs(i,color)) return false;
20           }else if (vis[i] != 0 && vis[i] != color) {
21               return false;
22           }
23       }
24   }
25   return true;
26 }
27 
28 bool dyeing()
29      //染色
30 {
31   for (int i = 1;i <= n;i++) {
32       if (vis[i] == 0) {
33           if(!dfs(i,black)) {
34               return false;
35           }
36       }
37   }
38   return true;
39 }
40 
41 int main()
42 {
43   int i,j,k,a,b;
44   scanf("%d %d",&n,&m);
45   for (i = 0;i < m;i++) {
46       scanf("%d%d",&a,&b);
47       g[a][b] = g[b][a] = 1;
48   }
49   if (!dyeing()) {
50       printf("no\n");
51   }else {
52       printf("yes\n");
53       printf("%d\n",res);
54       for (i = 1;i <= n;i++) {
55           if (vis[i] == black) {
56               printf("%d ",i);
57           }
58       }
59       printf("\n");
60   }
61   return 0;
62 }
63 


posted on 2010-02-07 20:00 schindlerlee 阅读(829) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


专题:Android  iPad jQuery Chrome OS

博客园首页  IT新闻  知识库  学英语  C++程序员招聘
标题  
姓名  
主页
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
登录后才能发表评论
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
每天10分钟,轻松学英语
网站导航: