题意:
给出一个无向联通图,要求你给出每条边的方向,使得无论从哪个点出发最多只能走一条边;
思路:
对于每个点,要么出度为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; }