题意

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

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

思路

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

法1 dfs:

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

法2 拓扑排序:

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

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

代码

法1:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=5e3+5;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
vector<int> g[N];
int e[N][N],vis[N],col[N],gg,in[N];
void dfs(int u)
{
int sz=g[u].size();
in[u]=1;
for(int i=0;i<sz;i++)
{
int v=g[u][i];
if(!vis[v])
{
vis[v]=1;
col[e[u][v]]=1;
dfs(v);
}
else if(in[v])
{
col[e[u][v]]=2;
gg=1;
}
else
{
col[e[u][v]]=1;
}
}
in[u]=0;
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
e[u][v]=i;
}
gg=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
// col[i]=1;
vis[i]=1;
dfs(i);
}
}
if(!gg)
{
cout<<1<<endl;
for(int i=1;i<=m;i++)
cout<<1<<" ";
cout<<endl;
}
else
{
cout<<2<<endl;
for(int i=1;i<=m;i++)
cout<<col[i]<<" ";
cout<<endl;
}
}
return 0;
}

  

法2:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
vector<int> g[N];
int col[N],du[N];
int n,m;
bool topo()
{
queue<int> q;
for(int i=1; i<=n; i++)
if(du[i]==0) q.push(i);
int cnt=0;
while(!q.empty())
{
int t=q.front();
for(int i:g[t])
{
du[i]--;
if(du[i]==0)
q.push(i);
}
cnt++;
q.pop();
}
if(cnt!=n)
return false;
return true;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1; i<=m; i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
col[i]=(u<v);
du[v]++;
}
if(topo())
{
cout<<1<<endl;
for(int i=1;i<=m;i++)
cout<<1<<" ";
cout<<endl;
}
else
{
cout<<2<<endl;
for(int i=1;i<=m;i++)
cout<<col[i]+1<<" ";
cout<<endl;
}
return 0;
}

  

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. SAP 下钻功能大全

    FORM ALV_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM "作为reuse_alv_grid_display的事件i_callback_user_c ...

  2. console 有没有小伙伴跟我一样想知道这个对象呢

    晚上看了会代码,没什么简单又好分享的 -0- 突然想到console这个对象,就把它打印了出来看看吧 ; for(var key in console){ i++; ){ document.write ...

  3. C lang: The Command line

    Ax_command line h Ax_a command line describe The command line is in enviroment for DOS,to user opera ...

  4. Symfonos:3 Vulnhub Walkthrough

    主机扫描: ╰─ nmap -p1-65535 -sV -A -sT 10.10.202.130 Starting Nmap 7.70 ( https://nmap.org ) at 2019-08- ...

  5. You don't have permission to access / on this server,Forbidden

    wampserver配置虚拟主机Forbidden,apache You don't have permission to access 找到httpd.conf文件(通常在安装apache的conf ...

  6. 数据库表数据统计及数据表的数据大小统计SQL

    USE [YourDBName] -- replace your dbname GO SELECT s.Name AS SchemaName, t.Name AS TableName, p.rows ...

  7. dbms_profiler

    @?/rdbms/admin/profload.sql @?/rdbms/admin/proftab.sql CREATE or replace PUBLIC SYNONYM plsql_profil ...

  8. 第十六届浙江大学宁波理工学院程序设计大赛 E 雷顿女士与平衡树(并查集)

    题意 链接:https://ac.nowcoder.com/acm/contest/2995/E来源:牛客网 卡特莉正在爬树,此时她又在树梢发现了一个谜题,为了不令她分心以至于发生意外,请你帮她解决这 ...

  9. 第一篇:C++之hello world

    1.编辑器:Microsoft Visual C++ 2010,下载安装 2.新建项目 代码: #include <iostream>#include <Windows.h>/ ...

  10. core-js@3带来的惊喜

    core-js 这个名词肯定很多人没听过,今天也是在配置babelpolyfill方法发现的 起因 在使用useBuiltIns:usage按需加载polyfill时,npm run build,就出 ...