题目大意:有个一无向图,给所有的边染色,如果一个点连接的边超过两个,那么最少要染一个白色和一个黑色,能否给整个图染色?不能输出“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. python中文问题汇总

    1.中文路径 #-*-coding:utf-8-*- path=ur'E:\accumulate\Python\语法\08输入和输出\1.txt' #python内部使用的是unicode,不加前缀u ...

  2. OC调用Swift 整理步骤!总结别人的!方便自己查找!

    1. 2. 上面的修改了一个配置项,有一个Product Module Name在后面会使用. 在工程里面点击File/New/File…,选择iOS/Source/Cocoa Touch Class ...

  3. 原生Javascript实现控制DIV属性

    写在前面: 从事前端工作已有一年之久,因为工作的性质,不太涉及JS方面,所以自己的JS水平一直处于小白阶段,工作闲暇之余,在网上找了一些小项目,希望练练手,促进自己成长.这是第一篇,后续还会有很多记录 ...

  4. vecor预分配内存溢出2

    vector预分配内存溢出导致原始的 迭代器 失效 consider what happens when you add the one additional object that causes t ...

  5. Linux Bash环境下单引(')、双引号(")、反引号(`)、反斜杠(\)的小结

    在bash中,$.*.?.[.].’.”.`.\.有特殊的含义.类似于编译器的预编译过程,bash在扫描命令行的过程中,会在文本层次上,优先解释所有的特殊字符,之后对转换完成的新命令行,进行内核的系统 ...

  6. Java学习----类的组织(包)

    1.包的概念 javac Engine.java -d . package:打包,把类文件编译成class文件会把Engine.class 放到com/cindy/pkg1/目录下 运行Engine ...

  7. C#中class的访问级别

    中午吃饭前,同事问了一个问题:class 前面不加public访问修饰符时的默认访问级别是什么? 当时脑海自然而然的闪过了private 级别,但是细想感觉不对,class 是在namespace之下 ...

  8. UI图标不用愁:矢量字体图标Font-Awesome

    Font-Awesome,这个项目主要是css3的一个应用,准确的说是一段css,这里的把很多图标的东西做到了font文件里面,然后通过引用外部font文件的方式,来展现图标. Font Awesom ...

  9. 关于【键鼠<局域网>共享软件:synergy】install

    Installation 另外,本人在centos6.5环境下作为server运行时,遇到一个问题,synergy1.5随着系统升级居然变成了1.3X,所以如果遇到类似问题,请您先用 rpm -qa ...

  10. UML for Design Pattern

    ************************************************************************************* ************** ...