链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348
2 3 3 1 2 2 3 3 1 7 6 1 2 1 3 1 4 1 5 1 6 1 7
1 1 1 0 1 0 1 0 1
题意:给n点m条无向边,要给每条边定一个方向,最后图中所有点的出入度差小于等于1.
做法:暴搜,注意用完的边要删去,更新下head就可以删边了。 然后 每个dfs 只找一条路径, 找到后就break。
#pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <string> #include <iostream> using namespace std; const int N=100100; const int M=300100; struct Edge{ int to, nex , id , fan; }edge[M*2]; int head[N],edgenum;//2个要初始化-1和0 void add(int u, int v, int id ,int fan) { Edge E = { v, head[u], id, fan}; edge[ edgenum ] = E; head[ u ] = edgenum++; } void init(){edgenum=0;} //for(int i=head[nw];i!=-1;i=edge[i].nex) int du[N];//出减 入加 int bian[M]; void dfs(int nw,int fx) { for(int i=head[nw];i!=-1;i=head[nw]) { int to=edge[i].to; if(bian[edge[i].id]==-1)//还没确定方向 { if(du[nw]!=-1&&du[to]!=1&&fx!=2) { du[nw]--; du[to]++; bian[edge[i].id]=(1^edge[i].fan); head[nw]=edge[i].nex; dfs(to,1); } else if(du[nw]!=1&&du[to]!=-1&&fx!=1) { du[nw]++; du[to]--; bian[edge[i].id]=(0^edge[i].fan); head[nw]=edge[i].nex; dfs(to,2); } else continue; break; } else head[nw]=edge[i].nex;//删边 } } int main() { int t; scanf("%d",&t); while(t--) { int n,m; init(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) head[i]=-1; for(int i=0;i<m;i++) { bian[i]=-1; int u,v; scanf("%d%d",&u,&v); if(u==v) { bian[i]=0; continue; } add(u,v,i,0); add(v,u,i,1); } for(int i=1;i<=n;i++) du[i]=0; for(int i=1;i<=n;i++) { while(head[i]!=-1) dfs(i,0); } for(int i=0;i<m;i++) printf("%d\n",bian[i]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 5348 MZL's endless loop 暴搜
原文地址:http://blog.csdn.net/u013532224/article/details/47299037