/*
在一个有向图中找出所有的环,按字典序输出
解法:以每个点为起点dfs,搜索u->v时如果v是已经访问的点,那么必然有v->u->v的环
一直在纠结怎么排序,怎么判重。
其实,在搜索点i后,ins[i]不清空标记就行了,因为如果后续有环经过i,那么这个环必然是重复的(从i搜索的时候必然可以搜索到)。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#define MAX 12 // 点的最大数量
#define MAXE 200// 边的最大数量
using namespace std;
int g[MAX][MAX];
int ins[MAX];// 是否在栈中
int n;
int s[MAX];
int snum;
int index=1;
int DFS(int x)
{
s[snum++]=x;
for(int i=0;i<n;i++)if(g[x][i])
{
if(ins[i]&&i==index)
{
for(int i=0;i<snum;i++)
printf("%d",s[i]);
printf("\n");
}
else if(!ins[i])
{
ins[i]=1;
DFS(i);
ins[i]=0;
snum--;
}
}
return 1;
}
void solve()
{
for(int i=0;i<n;i++)
{
snum=0;
index=i;
ins[i]=1;
DFS(i);
}
}
void init()
{
while(scanf("%d",&n)!=EOF)
{
memset(ins,0,sizeof(ins));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&g[i][j]);
}
solve();
puts("");
}
}
int main()
{
init();
return 0;
}
HDU 3964 Find The Simple Circle
最新推荐文章于 2019-04-09 12:22:12 发布