F. Graph Without Long Directed Paths (dfs)我居然忘记剪枝了

本文解析了CodeForces竞赛F题,介绍了如何通过设定边的方向避免形成环路的方法,并提供了一段C++代码实现。重点在于理解每个节点只能作为入度或出度节点的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://codeforces.com/contest/1144/problem/F

题意:给你n个点的无向图,现在让你给每一条边设置一个方向,满足图中不能有两条路径。

 

题解:每个点只能作为入度点或者出度点。最后的最后,我居然忘记了剪枝,超内存,艹。

#include<bits/stdc++.h>

using namespace std;

vector<int> vec[200010];
int n,m;

struct node{
    int x,y;
}ans[200010];

map<int,int> book;
bool flag;

//bool vis[200010];

void dfs(int u,int pre)
{
    int len=vec[u].size();

    for(int i=0;i<len;i++)
    {
        int v=vec[u][i];
        if(v==pre) continue;
//        if(book[v]!=0) continue;
        if(book[u]==1){
                if(book[v]==1){
                    flag=1;return;
                }
                if(book[v]==2) continue;///剪枝
            book[v]=2;
            dfs(v,u);
        }
        else if(book[u]==2){

                if(book[v]==2){
                    flag=1;return;
                }
                if(book[v]==1) continue;
            book[v]=1;
            dfs(v,u);
        }
    }
    if(flag==1) return;
}

int main()
{
        scanf("%d%d",&n,&m);

        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            vec[a].push_back(b);
            vec[b].push_back(a);
            ans[i].x=a;
            ans[i].y=b;

        }

        book[1]=1;
//        vis[1]=1;
        dfs(1,1);

//        for(int i=1;i<=n;i++)
//        if(book[i]==0){
//            puts("NO");return 0;

//        }

        if(flag){
            puts("NO");
            return 0;
        }
        puts("YES");
        for(int i=1;i<=m;i++)
        {
            if(book[ans[i].x]==1) printf("1");///1表示入度点
            else printf("0");
        }
        puts("");
        return 0;


}

/*
6 5
1 5
2 1
1 4
3 1
6 1

YES
10100

5 5
1 2
2 4
4 3
3 5
5 1



*/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值