Description

现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。
找到一种步数最小的方案,使得所有边的颜色相同。

Input

第一行包含两个数n,m(1<=n,m<=100000)分别代表节点数和边的数量
接下来m行描述边,第i行ui,vi,ci,代表ui有一条颜色为ci的边与vi相连(ci是B或者是R),B代表蓝色,R代表红色。数据保证没有自环的边。

Output

如果没有方案就输出-1。否则第一行输出k代表最小的步数

Sample Input

输入1:
3 3
1 2 B
3 1 R
3 2 B输入3:
4 5
1 2 R
1 3 R
2 3 B
3 4 B
1 4 B

Sample Output

输出1:
1输出3:
-1

Data Constraint

对于30%数据,n<=20,m<=20

分析

非常简单的染色问题

我们分两次BFS,一次选择把全部边变成红色,另一次显然

然后一个点显然变两次是一样的,所以我们当边的颜色是否与当前选择的颜色不同给连接的点染色,若已染则判断是否相同或不同

#include <iostream>
#include <cstdio>
#include <queue>
#include <memory.h>
using namespace std;
const int N=1e5+10;;
struct Edge {int u,v,nx,type;
}g[2*N];
int cnt,list[N];
int n,m;
bool b[N],vis[N];
int ok,ans=2147483647,lans[2];void Add(int u,int v,char type) {g[++cnt]=(Edge){u,v,list[u],type=='R'?1:0};list[u]=cnt;g[++cnt]=(Edge){v,u,list[v],type=='R'?1:0};list[v]=cnt;
}int BFS(int v0,int same) {queue<int> q;while (!q.empty()) q.pop();q.push(v0);vis[v0]=1;lans[1]++;while (!q.empty()) {int u=q.front();q.pop();for (int i=list[u];i;i=g[i].nx) {if (!vis[g[i].v]) {b[g[i].v]=g[i].type==same?b[u]:(b[u]^1);lans[b[u]^(g[i].type==same)]++;q.push(g[i].v);vis[g[i].v]=1;}elseif (g[i].type==same&&b[u]!=b[g[i].v]||g[i].type!=same&&b[u]==b[g[i].v]) return -1;}}return min(lans[0],lans[1]);
}int main() {scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) {int u,v;char c;scanf("%d%d",&u,&v);scanf("%c",&c);while (c!='R'&&c!='B') scanf("%c",&c);Add(u,v,c);}for (int i=0;i<2;i++) {bool p=1;int cans=0,nans=0;memset(b,0,sizeof b);memset(vis,0,sizeof vis);for (int j=1;j<=n;j++) if (!vis[j]) {lans[0]=lans[1]=0;cans=BFS(j,i);if (cans==-1) {p=0;break;}nans+=cans;}if (p) ans=min(ans,nans);ok+=p;}if (!ok) printf("-1");else printf("%d",ans);
}

View Code

转载于:https://www.cnblogs.com/mastervan/p/10764860.html

[BFS]JZOJ 4672 Graph Coloring相关推荐

  1. [CF1499G]Graph Coloring

    Graph Coloring 题解 一个晚上又没了... 我们考虑什么情况下 ∑ v ∈ V ∣ r ( v ) − b ( v ) ∣ \sum_{v\in V}\left|r(v)-b(v)\ri ...

  2. C++图形着色graph coloring算法(附完整源码)

    图形着色graph coloring算法 图形着色graph coloring算法的完整源码(定义,实现,main函数测试) 图形着色graph coloring算法的完整源码(定义,实现,main函 ...

  3. 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring

    题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai​>aj​时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...

  4. 夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation

    文章目录 做题情况项目报告 Uncle Bogdan and Country Happiness Graph Coloring How Many Paths? Array Differentiatio ...

  5. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring

    #include <bits/stdc++.h> using namespace std; const int maxn = 1000005, INF = 0x7f7f7f7f; int ...

  6. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...

  7. Graph Coloring I

    来源:牛客网: 题目描述 修修在黑板上画了一些无向连通图,他发现他可以将这些图的结点用两种颜色染色,满足相邻点不同色. 澜澜不服气,在黑板上画了一个三个点的完全图.修修跟澜澜说,这个图我能找到一个简单 ...

  8. poj1419 Graph Coloring 最大独立集(最大团)

    最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团 最大团=补图的最大独立集 #include<iostrea ...

  9. 一文直击Graph Embedding图表示学习的原理及应用

    导读:我们都知道在数据结构中,图是一种基础且常用的结构.现实世界中许多场景可以抽象为一种图结构,如社交网络,交通网络,电商网站中用户与物品的关系等. 目前提到图算法一般指: 经典数据结构与算法层面的: ...

最新文章

  1. JavaScriptjQuery.变量作用域
  2. 用户'NT AUTHORITY\NETWORK SERVICE' 登录失败
  3. 解读ASP.NET 5 MVC6系列(17):MVC中的其他新特性
  4. How to allow/block PING on Linux server – IPTables rules for icmp---reference
  5. Silverlight在调用wcf时传输数据过大返回Not Found的解决办法
  6. Java基础—序列化关键字transient
  7. 关系数据库模式和完整性约束相关概念
  8. [Abp 源码分析]ASP.NET Core 集成
  9. 2场直播丨CloudQuery最佳实践,
  10. Mybatis 动态表名,插入数据
  11. 35张史上最全IT架构师技术知识图谱
  12. ubuntu18 防火墙关闭_Ubuntu防火墙怎么关闭或打开?
  13. 在Ubuntu中下载github上的文件
  14. 解决U盘复制拷贝文件过大不能超过4G的方法
  15. Ubuntu配置静态IP以及interfaces配置不生效问题解决
  16. 解决XP系统桌面图标蓝底
  17. mac命令行压缩解压rar文件
  18. BZOJ 1143 祭祀 river(最大独立集)
  19. 清华、复旦、武大……全国近30所高校,超200位学子将相聚世界区块链大会·武汉高校分论坛...
  20. 昭阳K2450笔记本安装Linux,可能是最难拆的笔记本:lenovo 联想 昭阳K2450 升级固态硬盘的艰难历程...

热门文章

  1. 04-图像的阈值操作
  2. mysql创建表时出现1071_mysql 出现1071错误怎么办
  3. 2560介绍_炒股高手收益翻10倍,只因妙用这一招2560战法,看了都不亏了
  4. 台达plc控制伺服电机编程实例_PLC控制伺服电机:控制脉冲的相关计算
  5. matlab figure 嵌套,操作Matlab的Figure窗口(一)
  6. 发送请求_发送soap请求调用WSDL
  7. hdu 5299——Circles Game
  8. centos 无法连接网络
  9. linux网络编程之网络应用设计模式、分层模型、通信过程
  10. c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)