CF1217D Coloring Edges 判断有无环的有向图

题意:给你一张有向图,n个点,m条边,要求同一个环里的边不可以全部都为同一种颜色。问最少要涂多少种颜色,并依次给每条边编颜色号。

思路:简单的拓扑想法,一开始我用BFS的拓扑发现一直RE3,然后我就改了个很简单的DFS拓扑的样子,用邻接表vector连接每一个点。

在我用DFS的时候发现了一个问题,比如1->2,1->3,2->3,如果访问过的都编为vis[i]=1,则误把他弄成一个环了,所以访问完之后把vis[i]的值变为2就OK了,比如刚刚那个,先访问1->2,2->3,访问结束vis[3]=2先,然后回到1那里判断1->3,vis[3]刚好之前变了2,就不会判断一个错误的环了。(其实也不算拓扑吧=。=)

呈上代码!

#include <iostream>
#include <vector>
#include<cmath>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define N 200005
int degree[N],u[N],v[N];
vector<int>G[N];
int n, m;
int flag = 0;
int vis[N];
void topo(int u)
{
    if (flag)return;
    vis[u] = 1;//已被访问过一次
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (!vis[v])topo(v);//访问下一个点
        else if (vis[v] == 1)
        {
            flag = 1;//有环出现
            return;
        }
    }
    vis[u] = 2;//结束访问
}
int main()
{
    ll i, j, k;
    cin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        cin >> u[i] >> v[i];
        G[u[i]].push_back(v[i]);//邻接表
    }
    for (i = 1; i <= n; i++)
        if (!vis[i])
            topo(i);
    if (flag)
    {
        cout << 2 << endl;
        for (i = 1; i <= m; i++)
            if (u[i] < v[i])
                cout << 1 << " ";
            else
                cout << 2 << " ";
        cout << endl;
    }
    else
    {
        cout << 1 << endl;
        for (i = 1; i <= m; i++)
            cout << 1 << " ";
        cout << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ch-hui/p/12641992.html

时间: 2024-08-30 11:28:24

CF1217D Coloring Edges 判断有无环的有向图的相关文章

UVA11090 Going in Cycle!! (二分+SPFA判断有无负权)

I I U P C 2 0 0 6 Problem G: Going in Cycle!! Input: standard input Output: standard output You are given a weighted directed graph with n vertices and m edges. Each cycle in the graph has a weight, which equals to sum of its edges. There are so many

spfa 判断负环 (转载)

判断给定的有向图中是否存在负环. 利用 spfa 算法判断负环有两种方法: 1) spfa 的 dfs 形式,判断条件是存在一点在一条路径上出现多次. 2) spfa 的 bfs 形式,判断条件是存在一点入队次数大于总顶点数. 代码如下: 法 1 (spfa 的 dfs 形式): #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int oo = 1 &

POJ 1860 Currency Exchange(如何Bellman-Ford算法判断正环)

题目链接: https://cn.vjudge.net/problem/POJ-1860 Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be s

【BZOJ1690】【Usaco2007 Dec】奶牛的旅行 分数规划 判断负环

题解: 分数规划+判断负环. 代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 5050 #define eps 1e-8 using namespace std; double mid,fun[N]; struct Eli { int v,n; do

Reachability判断有无网络

在整理以前的东西,突然,发现判断网络也是很好玩的东东.于是整理了一下. 这个是需要一个第三方的库Reachability. 开始说上传的步骤: 1)在网络上下载第三方库Reachability.还是那句话,把库要放在工程文件的文件夹下,然后,右键添加. 2)运行一下代码,应该会出现关于Arc的错误 ,此时.BuildPhases--->CompileSources--->找到库所包含的文件--->fno-objc-arc. 3)验证代码,应该添加成功. .m部分 //加入头文件 #imp

spfa判断负环

会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口,并且使得时间倒退一段时间. John 的每个农场包含 N(1≤N≤500)块地,编号从 1-N,这 N 块地之间有 M(1≤M≤2500)条路. W(1≤W≤200)个昆虫洞.因为 John 是一个狂热的时间旅行迷,他想尝试着做这样一件事:从某块地出发,通过一些路径和昆虫洞,返回到出发点,并且时间早

POJ #1860 Currency Exchange 最短路径算法 判断负环

Description 题目描述在这里:链接 更多的样例:链接 思路 我们把每种货币看成图的顶点,而每个交换站点实现一对货币的交换,可认为增加一个交换站点就是增加两个顶点间的一个环路.从样例中可以知道,如果想要让NICK的资金增加,那么就需要存在一个权值为正的环路,使得货币总价值能够无限上升. 所以现在的问题变成了如何判断图中是否有正环.由于货币交换后总价值可能降低,也就是说可能存在负权边,那么 Dijkstra 就不适用了,应该采用能判断负环的 Bellman_ford ,还有它的优化算法 S

一种科学的判断负环的方法

判断负环的方法 ------------ 这里有个叫分界线的家伙突然想说,本章主体思路都是在 SPFA 上的o ------------ 感觉分为两种大方向,\(BFS\) 和 \(DFS\) 快速写一下 \(BFS\) 的思路 由 \(SPFA\) 的算法可以发现,如果要更新一个点的 \(dis\) ,那么一定有一个点先被更新了以后,然后通过这个新更新的点来更新这个点,那么在没有负环的情况下,一个点能被更新的最多次数为 \(n\) 次,也就是说,如果一个点进队的次数大于 \(n\) 了,嘿嘿嘿

POJ3259(Wormholes) 判断负环

题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞,返回到他最初开始走的地方并且时间要在他离开之前,或者恰好等于他离开的时间. 把虫洞的时间看成负边权,就是是否存在负权回路.  虽然题中没有说明起点和终点 但从1开始即可  因为无论从哪个点开始 有没有负环的情况都是一样的 spfa 判断负环: #include <iostream> #inclu