题目大意:有个一无向图,给所有的边染色,如果一个点连接的边超过两个,那么最少要染一个白色和一个黑色,能否给整个图染色?不能输出“No solution”。

分析:引用连接 http://edward-mj.com/archives/445

首先构建dfs树,无向图dfs树具有的一大优点是该点只会向自己的祖先或子孙有非树边。

然后按深度交替染色。返祖边与自己的儿子涂同样的颜色。

如果dfs树中根结点度超过1,那么就找一条边染不同的颜色。

否则看根结点是否满足条件,如果不是,那么找一个与根结点相连的叶子,向上找到一个度大于2的点为止,将该路径上所以边反色,并且将根与该叶子的边反色。如果找不到度大于2的点,那么是奇环,无解。

ps.注意这组数据:

5
2 3 0
1 3 0
1 2 4 5 0
3 5 0
3 4 0

代码如下:

======================================================================================================================

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std; const int MAXN = ; int c[MAXN][MAXN], N;///保存边的颜色, N个点
int father[MAXN], nSon[MAXN];
vector<int> e[MAXN];///相连接的点 void DFS(int u, int color)
{
for(int i=; i<e[u].size(); i++)
{
if(c[u][e[u][i]] != -)
continue;///这条边已经被访问过 nSon[u]++;///子树数目加1
c[e[u][i]][u] = c[u][e[u][i]] = color; if(!nSon[e[u][i]])
{///如果不是连接的祖边
father[e[u][i]] = u;
DFS(e[u][i], color^);
}
}
} int main()
{
int i, j, x; scanf("%d", &N); for(i=; i<=N; i++)
{
while(scanf("%d", &x), x)
e[i].push_back(x);
} memset(c, -, sizeof(c)); for(i=; i<=N; i++)
{
if(nSon[i] || father[i] || e[i].size()==)
continue; ///没有父节点,也没有儿子节点,说明未被访问过
for(j=; j<e[i].size(); j++)
{///与根节点连接的第一个节点赋值为颜色0,后面的赋值为别的颜色
if(j==)
{
nSon[i]++, father[e[i][j]] = i;
c[i][e[i][j]] = c[e[i][j]][i] = ;
DFS(e[i][j], );
}
else if(c[i][e[i][j]] == -)
{///这条边未被访问过
nSon[i]++, father[e[i][j]] = i;
c[i][e[i][j]] = c[e[i][j]][i] = ;
DFS(e[i][j], );
}
} if(nSon[i] >= || e[i].size() == )
continue;
///如果根节点的子树数目小于2,或者只有一个子节点 for(j=; j<e[i].size(); j++)
{///从子节点往父节点查找一个节点有大于或等于两个子树的节点
///如果找到那么就把这条路径上的所有边取反,如果找不到,无解 x = e[i][j]; if(c[x][i] == )
break;///不需要取反也可以 while(father[x] != i && nSon[x] < )
x = father[x]; if(father[x] == i)
continue;///未找到这样的节点 x = e[i][j];
c[x][i] = c[i][x] = ;
while(nSon[x] < )
{///路径上的边取反
c[x][father[x]] = c[father[x]][x] = c[x][father[x]] ^ ;
x = father[x];
} break;
} if(j == e[i].size())
break;///无解
} if(i <= N)
printf("No solution\n");
else
{
for(i=; i<=N; i++)
{
for(j=; j<e[i].size(); j++)
printf("%d ", c[i][e[i][j]]+);
printf("0\n");
}
} return ;
}
/**
5
2 3 0
1 3 0
1 2 4 5 0
3 5 0
3 4 0
**/

Bridges painting - SGU 121(构造)的更多相关文章

  1. sgu 121. Bridges painting 列举情况 难度:1

    121. Bridges painting time limit per test: 0.25 sec. memory limit per test: 4096 KB New Berland cons ...

  2. SGU 121.Bridges painting

    原题地址 题意: 新百慕大由N个岛屿组成,在岛屿之间有一些连接它们的桥.在任意两个岛屿之间,最多只有一座桥连接它们.总统先生下达命令,要求给所有桥上色. 每一座桥能被染成 白色 或者 黑色. 每一个岛 ...

  3. Erasing Edges - SGU 136(构造多边形)

    题目大意:已知一个多边形上的每条边的中点,还原出来一个多边形. 分析:因为偶数是不固定的,所以可以为任意起点,奇数只有一个,可以所有中点加减算出来第一个点,然后就是简单的向量计算点的位置了...... ...

  4. SGU 分类

    http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...

  5. 今日SGU 5.28

    SGU 121 题意:给你一张图,问你每个顶点必须有黑白两条边(如果它的边数>=2),问你怎么染色,不行就输出no 收获:你会发现不行的情况只有一个单纯的奇数环的时候,反之我们交替染色即可 #i ...

  6. echarts地图 绘制部分上海市公交线路数据

    源代码地址 https://github.com/a1115040996/MyHTML/blob/gh-pages/echarts/roadMap.html 预览地址 https://a1115040 ...

  7. SGU 183. Painting the balls( dp )

    dp..dp(i, j)表示画两个点为i-j, i的最优答案. dp(i, j) = min{ dp(i-j, k) } + cost[i] (1≤k≤M-j) 令f(i, j) = min{dp(i ...

  8. sgu 183. Painting the balls 动态规划 难度:3

    183. Painting the balls time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard ...

  9. 构造 - SGU 109 Magic of David Copperfield II

    Magic of David Copperfield II Problem's Link Mean: 略 analyse: 若i+j为奇数则称(i,j)为奇格,否则称(i+j)为偶格,显然每一次报数后 ...

随机推荐

  1. YouTube视频代码总结

    var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api" ...

  2. sublime text 3 安装中文

    本经验目前在Ubuntu14.04环境下,已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功. END 解决方法步骤2   1 保存下面的代码到文件sublime_imf ...

  3. MOOC即Massive Open Online Course的缩写

    A man can succeed at almost anything for which he was unlimited enthusiasm. 只要有无限的热情,一个人几乎可以在任何事情上取得 ...

  4. Hybrid App开发者一定不要错过的框架和工具

    最近开始给网站的移动版本做技术选型,发现了很多好玩的东西,写出来给大家分享下. ionicFramework 我是hybrid app的忠实粉丝和大力倡导者,从 新浪移动云开始就不断的寻找能帮助Web ...

  5. DataTable 无法转换的错误

    目前基本上检索都已经离不开Linq了.所以最近在Linq的过程中出现了一些意外情况,特此记录下来. 先描述一下场景: 有一个查询的要求是这样的,检索出Status > 1 的数据.因为要根据其他 ...

  6. NET Core站点部署到Linux服务器

    .NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上 今天下午我们将生产环境中一个单台服务器 QPS(每秒请求数)在100左右的 ASP.NET Core 站 ...

  7. iOS 细节 问题

    1.当一个空指针(nil pointer)调用了一个方法会发生什么? 安然无恙 —— 这是oc自带的消息机制,nil也能发送消息,而不会报错 2.为什么retainCount绝对不能用在发布的代码中? ...

  8. document.body.clientWidth vs document.documentElement.clientWidth

    http://blog.csdn.net/zb0567/article/details/7182391 mobile web javascript library http://www.gbin1.c ...

  9. Android系统的体系结构、开发语言及源码结构

    整理自android系统体系结构 Android 是google公司针对手机开发的一个平台,并公布了其中大部分代码,其大部分应用程序都是用JAVA开发的,毕竟它是商业性的产品嘛,有所保留也是理所 当然 ...

  10. Android SwitchCompat 自定义颜色及使用

    在Android 5.0 中 Switch 更新了样式 变得 比较好用了 但是在5.0 以下的版本 还是老样子 不实用 因此 就有了 SwitchCompat 来兼容 它是v7 包中的 因此可兼容到 ...