Bridges painting - SGU 121(构造)
题目大意:有个一无向图,给所有的边染色,如果一个点连接的边超过两个,那么最少要染一个白色和一个黑色,能否给整个图染色?不能输出“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(构造)的更多相关文章
- sgu 121. Bridges painting 列举情况 难度:1
121. Bridges painting time limit per test: 0.25 sec. memory limit per test: 4096 KB New Berland cons ...
- SGU 121.Bridges painting
原题地址 题意: 新百慕大由N个岛屿组成,在岛屿之间有一些连接它们的桥.在任意两个岛屿之间,最多只有一座桥连接它们.总统先生下达命令,要求给所有桥上色. 每一座桥能被染成 白色 或者 黑色. 每一个岛 ...
- Erasing Edges - SGU 136(构造多边形)
题目大意:已知一个多边形上的每条边的中点,还原出来一个多边形. 分析:因为偶数是不固定的,所以可以为任意起点,奇数只有一个,可以所有中点加减算出来第一个点,然后就是简单的向量计算点的位置了...... ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- 今日SGU 5.28
SGU 121 题意:给你一张图,问你每个顶点必须有黑白两条边(如果它的边数>=2),问你怎么染色,不行就输出no 收获:你会发现不行的情况只有一个单纯的奇数环的时候,反之我们交替染色即可 #i ...
- echarts地图 绘制部分上海市公交线路数据
源代码地址 https://github.com/a1115040996/MyHTML/blob/gh-pages/echarts/roadMap.html 预览地址 https://a1115040 ...
- 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 ...
- 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 ...
- 构造 - SGU 109 Magic of David Copperfield II
Magic of David Copperfield II Problem's Link Mean: 略 analyse: 若i+j为奇数则称(i,j)为奇格,否则称(i+j)为偶格,显然每一次报数后 ...
随机推荐
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- jquery自适应布局
代码整理 - uix.layout.js /** * Grace [jQuery.js] * * UIX页面布局 * 290353142@qq.com * exp: * $.uix.layout(); ...
- C++拷贝构造函数详解 转
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100; int b = a; 而类对象与普通 ...
- C/C++之Exercise
一.C/C++之初学Demo---C++调用C.h文件使用实例: 工程结构: exercise.h code: #ifndef _EXERCISE_H_ #define _EXERCISE_H_ #i ...
- sql 命令操作用法
---恢复内容开始--- 远程登录数据库: mysql -u root -p 要求输入密码 ============== 查看数据库: show databases;============= 选择数 ...
- C#连接、访问MySQL数据库
一.准备工具 visual stuido(本示例使用visual studio 2010) MySql.Data.dll mysql_installer_community_V5.6.21.1_set ...
- angularjs入门整理
之前发过一篇博文,从mobile angular ui的demo和其官网初识整个angularjs的大体使用,但是没很好学习,只是通过一些技术博文初步认识,陷入很多坑.所以现在在中文官网正式整理下知识 ...
- ThinkPHP HTML标签代码和UBB互相转换
1.UBB 转为 HTML TP的扩展里面自带一个ubb方法,用这个方法就能把用户输入的ubb格式代码转换为HTML标签的代码.这里用到的基本知识就是正则表达式啦,今天先不讲正则表达式. 来看一下TP ...
- servlet跳转jsp
ackage com.monkey.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; im ...
- PC和单片机通过MODBUS RTU通信
最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度.湿度.或者控制信号的状态等.有了MODBU ...