题目链接:https://vjudge.net/contest/330119#problem/A

题目大意:

1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色。问最少需要多少颜色,并输出各边的涂色。

解题思路:

1.多画几张图就发现,颜色种类只会是1或者2。当不存在环的时候,全部涂1。当存在环的时候,环中可以分成两种边(小节点指向大节点涂1,大节点指向小节点涂2),就会发现所有的环颜色一定不会全部相同。

2.思考过1就发现这道题只需要判断是否存在环即可。可以用拓扑判断。原理为:在拓扑的过程中,入度为0的点会入队,但由于环上各点入度不可能为0.因此无法入队。所以在拓扑结束后,还存在没有入队的点,即存在环。

 #include<stdio.h>
#include<string.h>
#include<queue>
#define mem(a, b) memset(a, b, sizeof(a))
const int MAXN = ;
const int MAXM = ;
using namespace std; int n, m;
int head[MAXN], cnt, in[MAXN], out[MAXN], tot;
queue<int> Q; struct Edge
{
int from, to, next;
}edge[MAXM]; void add(int a, int b)
{
cnt ++;
edge[cnt].from = a;
edge[cnt].to = b;
edge[cnt].next = head[a];
head[a] = cnt;
} int topo()
{
for(int i = ; i <= n; i ++)
{
if(!in[i])
{
Q.push(i);
tot ++;
}
}
while(!Q.empty())
{
int temp = Q.front();
Q.pop();
for(int i = head[temp]; i != -; i = edge[i].next)
{
int to = edge[i].to;
in[to] --;
if(!in[to])
{
Q.push(to);
tot ++;
}
}
}
if(tot != n) //存在 点 没有入队
return ;
else
return ;
} int main()
{
scanf("%d%d", &n, &m);
mem(head, -);
for(int i = ; i <= m; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
in[b] ++, out[a] ++;
add(a, b);
}
if(topo()) //判是否有环存在
{
printf("2\n");
int flag = ;
for(int i = ; i <= cnt; i ++)
{
int a = edge[i].from, b = edge[i].to;
if(flag)
{
if(a < b)
printf("");
else
printf("");
flag = ;
}
else
{
if(a < b)
printf("");
else
printf("");
}
}
printf("\n");
}
else
{
printf("1\n1");
for(int i = ; i < m; i ++)
printf("");
printf("\n");
}
return ;
}

最新文章

  1. 安卓---Toast工具类,有点懒
  2. js 实现表格的可编辑状态
  3. mybatis3.2.3+spring3 控制台打印sql解决办法
  4. redis集群安装
  5. Linux下更新时间
  6. Python 获取 网卡 MAC 地址
  7. [MFC]MFC中OnDraw与OnPaint的区别
  8. &#39;InitializeCulture&#39; is not a member of &#39;XXXX&#39;
  9. php 拓展 Filter 过滤器
  10. 敏捷软件开发模型--SCRUM
  11. 编程算法 - 有序双循环链表的插入 代码(C)
  12. KafKa介绍(分布式架构)
  13. VS2015安装时问题汇总
  14. js性能的进阶
  15. springcloud-3:required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found.
  16. Spring Boot 初始化运行特定方法
  17. HDU 2033 人见人爱A+B
  18. avalonjs 中的if else实现的几种方法
  19. ispoweroftwo 判断2的次幂【转】
  20. TensorFlow:tf.contrib.layers.xavier_initializer

热门文章

  1. python库下载网址
  2. Java+自动扫描文件夹+发送+上传
  3. 数据分析九:互联网征信中的信用评分模型(用户APP使用行为分析)
  4. 「LOJ 121」「离线可过」动态图连通性「按时间分治 」「并查集」
  5. Windows 用户和内核模式
  6. c 判断是否为 字母或数字(iswalnum example)
  7. MySQL监控利器-PMM
  8. AOP 底层实现原理
  9. chrome console控制台引入jquery库
  10. based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较