CF-1144F-Graph Without Long Directed Paths

题意:

给出一个无向联通图,要求你给出每条边的方向,使得无论从哪个点出发最多只能走一条边;

思路:

对于每个点,要么出度为0,要么入度为0即可。所以这就是一个判断二分图。

  • 二分图
    #include "cstdio"
    #include "cstring"
    #include "iostream"
    #include "vector" 
    using namespace std;
    typedef pair<int, int> PII;
    const int MAXN = 2e5 + 5;
    int n, m;
    PII edge[MAXN];
    // v[i]记录和i点相连的点 
    vector<int> v[MAXN];
    // 记录每个点的状态,-1表示未访问,0表示只有出度,1表示只有入度 
    int arr[MAXN];
    bool ok = true;
    void dfs(int n, int k) {
        if (arr[n] != -1) {
            if (arr[n] != k) {
                ok = false;
            }
            return;
        }
        arr[n] = k;
        for (int i = 0; i < v[n].size(); i++) {
            dfs(v[n][i], !k);
        }
    }
    int main() {
        int a, b;
        memset(arr, -1, sizeof(arr));
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++) {
            scanf("%d%d", &a, &b);
            // 存边,但是其实后面不用b了,存下a点就够了 
            edge[i] = make_pair(a, b);
            v[a].push_back(b);
            v[b].push_back(a);
        }
        dfs(1, 1);
        if (ok) {
            puts("YES");
            for (int i = 1; i <= m; i++) {
                printf("%d", arr[edge[i].first]);
            }
            puts("");
        } else {
            puts("NO");
        }
        return 0;
    }

     

posted @ 2019-04-02 18:16  Jathon-cnblogs  阅读(244)  评论(0编辑  收藏  举报