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

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/88955054

题目链接: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



*/

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/88955054