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