运用 反向建图 dfs 查找路径,回溯路径
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 1<<17
bool vis[MAX];
struct Node{
int v,u,id;
};
Node node[MAX];
int head[MAX];
int cnt=0;
int k;
int top=0;
void init()
{
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
cnt=0;
top=0;
}
void add_e(int u,int v,int id)
{
node[cnt].v=v;
node[cnt].u=head[u];
node[cnt].id=id;
head[u]=cnt++;
}
int str[MAX];
void dfs(int u)
{
for(int i=head[u];i!=-1;i=node[i].u)
{
if(!vis[node[i].id])
{
vis[node[i].id]=1;
int temp=node[i].id&1;
dfs(node[i].v);
str[top++]=node[i].id;
}
}
}
int main()
{
while(~scanf("%d",&k))
{
init();
int ans=1<<k;
printf("%d ",ans);
int len=1<<(k-1);
for(int i=0;i<len;i++)
{
int id=i<<1|1,v=id%len;
add_e(i,v,id);
id=i<<1,v=id%len;
add_e(i,v,id);
}
dfs(0);
for(int i=top-1;i>=0;i--)
{
printf("%d",str[i]/len);
}
printf("\n");
}
return 0;
}
DFS遍历 每一条边
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
using namespace std;
#define maxn 200005
struct Node{
int next;
int v;
int id;
};
Node node[maxn];
int head[maxn];
bool vis[maxn];
int cnt=0;
void init()
{
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
cnt=0;
}
void add_e(int u,int v)
{
node[cnt].v=v;
node[cnt].id=cnt;
node[cnt].next=head[u];
head[u]=cnt++;
}
int flag=0;
void dfs(int u)
{
for(int i=head[u];i!=-1;i=node[i].next)
{
if(vis[i]==0)//这一条边 没被访问过
{
vis[i]=1;
dfs(node[i].v);
flag=1;
}
}
}
int main() {
int n, m, p;
while(~scanf("%d%d", &n, &m))
{
int a,b;
init();
for(int i=0;i<m;i++)
{
scanf("%d%d", &a, &b);
add_e(a,b);
}
int ans=0;
for(int i=1;i<=n;i++)
{
flag=0;
dfs(i);
if(flag)
{
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
网友评论