Graph Without Long Directed Paths CodeForces - 1144F

初步思考
每条边有两个点,而且要是这个图路径不大于一的话,所有的边都会经过一个点,而每个边只有两个点,且没有重复边和反向边,那只要找到那个点,然后逐个比较就可以了。但是错在了test2。附错误代码:

#include
using namespace std;

int u[200005], v[200005];
string ans = "";
char temp;

int main(){
	int n, m, i, x=0;
	scanf("%d %d", &n, &m);
	for(i = 0; i < m; i++){
		scanf("%d %d", &u[i], &v[i]);
	}
	if(u[0]==u[1])
		x = u[0];
	if(u[0]==v[1])
		x = u[0];
	if(v[0]==u[1])
		x = v[0];
	if(v[0]==v[1])
		x = v[0];
		
	for(i = 0; i

后来仔细一想,不是这个逻辑。是自己给无向图附方向,使得每个方向路径都不大于一。所以要把点分为两个部分,一个是起点,一个是终点。一个点一旦变成起点就不能变为终点,即种类必须一致。再往下想(画图):
(1)可以发现只要图中包含着奇数边的环,就不满足此条件。所以这个问题就变成了寻找奇数环。
(2)或者直接分类,起点标1,终点标2,当冲突时,就视为no。

#include 
#include 
#include 
using namespace std;

int u[200005], v[200005], flag[200005];
vector ver[200005];
int n, m;

bool dfs(int p, int flag_temp){
    if(flag[p] == -1)
        flag[p] = flag_temp;
    if(flag[p] != flag_temp)
        return false;
    
    for(int i=0; i

你可能感兴趣的:(算法)