版权声明:转载注明下出处就行了。 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
*/