题意

https://vjudge.net/problem/CodeForces-1217D

请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量。

思路

因为是有向图,每个环两个颜色就可以满足了。所以最大为2,最小为1。

法1 dfs:

用dfs判断有向图的环,每次把构成环的最后那条边染成2,其余染成1。

法2 拓扑排序:

容易发现,对于一个有向图,如果成环那么点的序号必不是单调的,因为最后的那个点又会连回起始点。

所以我们把u<v染成1,u>v染成2,然后拓扑排序判环,如果有环那么就输出染色方案,否则全输出1。

代码

法1:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define inf 0x3f3f3f3f
  4. #define ll long long
  5. const int N=5e3+5;
  6. const int mod=1e9+7;
  7. const double eps=1e-8;
  8. const double PI = acos(-1.0);
  9. #define lowbit(x) (x&(-x))
  10. vector<int> g[N];
  11. int e[N][N],vis[N],col[N],gg,in[N];
  12. void dfs(int u)
  13. {
  14. int sz=g[u].size();
  15. in[u]=1;
  16. for(int i=0;i<sz;i++)
  17. {
  18. int v=g[u][i];
  19. if(!vis[v])
  20. {
  21. vis[v]=1;
  22. col[e[u][v]]=1;
  23. dfs(v);
  24. }
  25. else if(in[v])
  26. {
  27. col[e[u][v]]=2;
  28. gg=1;
  29. }
  30. else
  31. {
  32. col[e[u][v]]=1;
  33. }
  34. }
  35. in[u]=0;
  36. }
  37. int main()
  38. {
  39. std::ios::sync_with_stdio(false);
  40. int n,m;
  41. while(cin>>n>>m)
  42. {
  43. memset(vis,0,sizeof(vis));
  44. for(int i=1;i<=m;i++)
  45. {
  46. int u,v;
  47. cin>>u>>v;
  48. g[u].push_back(v);
  49. e[u][v]=i;
  50. }
  51. gg=0;
  52. for(int i=1;i<=n;i++)
  53. {
  54. if(!vis[i])
  55. {
  56. // col[i]=1;
  57. vis[i]=1;
  58. dfs(i);
  59. }
  60. }
  61. if(!gg)
  62. {
  63. cout<<1<<endl;
  64. for(int i=1;i<=m;i++)
  65. cout<<1<<" ";
  66. cout<<endl;
  67. }
  68. else
  69. {
  70. cout<<2<<endl;
  71. for(int i=1;i<=m;i++)
  72. cout<<col[i]<<" ";
  73. cout<<endl;
  74. }
  75. }
  76. return 0;
  77. }

  

法2:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define inf 0x3f3f3f3f
  4. #define ll long long
  5. const int N=200005;
  6. const int mod=1e9+7;
  7. const double eps=1e-8;
  8. const double PI = acos(-1.0);
  9. #define lowbit(x) (x&(-x))
  10. vector<int> g[N];
  11. int col[N],du[N];
  12. int n,m;
  13. bool topo()
  14. {
  15. queue<int> q;
  16. for(int i=1; i<=n; i++)
  17. if(du[i]==0) q.push(i);
  18. int cnt=0;
  19. while(!q.empty())
  20. {
  21. int t=q.front();
  22. for(int i:g[t])
  23. {
  24. du[i]--;
  25. if(du[i]==0)
  26. q.push(i);
  27. }
  28. cnt++;
  29. q.pop();
  30. }
  31. if(cnt!=n)
  32. return false;
  33. return true;
  34. }
  35. int main()
  36. {
  37. std::ios::sync_with_stdio(false);
  38. cin>>n>>m;
  39. for(int i=1; i<=m; i++)
  40. {
  41. int u,v;
  42. cin>>u>>v;
  43. g[u].push_back(v);
  44. col[i]=(u<v);
  45. du[v]++;
  46. }
  47. if(topo())
  48. {
  49. cout<<1<<endl;
  50. for(int i=1;i<=m;i++)
  51. cout<<1<<" ";
  52. cout<<endl;
  53. }
  54. else
  55. {
  56. cout<<2<<endl;
  57. for(int i=1;i<=m;i++)
  58. cout<<col[i]+1<<" ";
  59. cout<<endl;
  60. }
  61. return 0;
  62. }

  

CodeForces-1217D (拓扑排序/dfs 判环)的更多相关文章

  1. CodeForces 711D Directed Roads (DFS判环+计数)

    题意:给定一个有向图,然后你可能改变某一些边的方向,然后就形成一种新图,让你求最多有多少种无环图. 析:假设这个图中没有环,那么有多少种呢?也就是说每一边都有两种放法,一共有2^x种,x是边数,那么如 ...

  2. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

  3. cf1278D——树的性质+并查集+线段树/DFS判环

    昨天晚上本来想认真打一场的,,结果陪女朋友去了.. 回来之后看了看D,感觉有点思路,结果一直到现在才做出来 首先对所有线段按左端点排序,然后用并查集判所有边是否联通,即遍历每条边i,和前一条不覆盖它的 ...

  4. Atcoder Grand Contest 032C(欧拉回路,DFS判环)

    #include<bits/stdc++.h>using namespace std;int vis[100007];vector<int>v[100007];vector&l ...

  5. 拓扑排序+DFS(POJ1270)

    [日后练手](非解题) 拓扑排序+DFS(POJ1270) #include<stdio.h> #include<iostream> #include<cstdio> ...

  6. Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]

    传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...

  7. 拓扑排序/DFS HDOJ 4324 Triangle LOVE

    题目传送门 题意:判三角恋(三元环).如果A喜欢B,那么B一定不喜欢A,任意两人一定有关系连接 分析:正解应该是拓扑排序判环,如果有环,一定是三元环,证明. DFS:从任意一点开始搜索,搜索过的点标记 ...

  8. 拓扑排序-DFS

    拓扑排序的DFS算法 输入:一个有向图 输出:顶点的拓扑序列 具体流程: (1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v] (2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面 (3 ...

  9. cf374C Inna and Dima dfs判环+求最长链

    题目大意是有一个DIMA四种字母组成的矩阵,要在矩阵中找最长的DIMADIMADIMA……串,连接方式为四方向连接,问最长能找到多少DIMA.字母可以重复访问,如果DIMA串成环,即可以取出无限长的D ...

随机推荐

  1. 对token机制的学习和分析

    token,中文意思为令牌,是用户登录后会返回的一个字符串,里面包括用户信息.登录时间等,但是是加密过的密文,其加解密方式由后端决定. 在登录之后的接口请求中,前端需在请求中统一加上token,从而识 ...

  2. Jmeter中使用HTTP信息头管理器发送json格式请求体的接口

    Jmeter中,如果请求体的格式为x-www-form-urlencoded,则不需要添加请求头,保持默认即可,但是如果遇到接口的请求体格式为json时,就要用到HTTP信息头管理器,在线程组上右键— ...

  3. Hyperledger Fabric私有数据

    官方文档:点这里 1简介 在同一个通道中,允许某一组织在对同一通道内其他组织保持部分的数据私有.也就是说有一部分被标识为私有的数据只能具有权限的组织查看和操作,而其余组织不具备查看和操作私有数据的权限 ...

  4. mysql的锁机制详解

    这段时间一直在学习mysql数据库.项目组一直用的是oracle,所以对mysql的了解也不深.本文主要是对mysql锁的总结. Mysql的锁主要分为3大类: 表级锁:存储引擎为Myisam.锁住整 ...

  5. Hive数据类型和DDL操作

    hive命令 在Linux下的命令行中直接输入如下命令,可以查看帮助信息: # hive -help 常用的如-e.-f参数. 使用-e参数,可以直接在命令行传递SQL语句进行hive表数据的查询: ...

  6. PHP 日期之间所有日期

    /** * 获取起止日期之间所有日期 * @param $sdate * @param $edate * @return array */ function get_dates($sdate, $ed ...

  7. MySQL相关参数总结

    保留个原文链接,避免被爬虫爬了过去,以便后续更正补充:https://www.cnblogs.com/wy123/p/11273023.html MySQL参数繁多,是一个需要根据具体业务.软硬件环境 ...

  8. python科学计算和数据分析常用库

    NumPy NumPy最强大的是n维数组,该库还包含基本的线性代数函数.傅立叶变换.随机函数和其他底层语言(如Fortran.C和C++)集成的工具. SciPy SciPy建立在NumPy基础上,它 ...

  9. 5G技术发展迅猛,亚博电竞(yabo055)搭上科技快车

    要说当前互联网科技最为令人期待的当属yabo055点康母的5G技术了.自2018年5G标准确定以来,民众就对5G非常的期待,而亚博电竞早已意识到了5G时代的来临势不可挡,早已着手将5G运用于网站和游戏 ...

  10. 开发一个这样的 APP 要多长时间?

    作者:蒋国刚 www.cnblogs.com/guogangj/p/4676836.html 这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正 ...