poj 2230 欧拉回路
题意,一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点。
直接dfs一下就好了,vis[]标记边是否访问,不会的仔细模拟一遍哪个dfs就好了
View Code
#include<stdio.h>
#include<string.h>
struct Edge{
int v,next;
}edge[111111];
int head[11111];
int n,m,tot;
bool vis[111111];
void add(int s,int t)
{
edge[tot].v=t;
edge[tot].next=head[s];
head[s]=tot++;
}
void dfs(int u)
{
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(!vis[i])
{
vis[i]=true;
dfs(edge[i].v);
}
}
printf("%d\n",u);
}
int main()
{
scanf("%d%d",&n,&m);
int i,a,b;
tot=0;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
memset(vis,0,sizeof(vis));
dfs(1);
return 0;
}
java
View Code
import java.io.*;
import java.util.*;
import java.math.*;
class Edge{
int v,next;
boolean vis;
Edge (int v,int next){
this.v=v;
this.next=next;
this.vis=false;
}
}
class Graph{
static int MAXN = 10010;
static int n, m, size;
static int[] ans = new int[MAXN*3];
static int[] head = new int[MAXN];
static Edge[] edge = new Edge[MAXN*10];
Graph(){
Arrays.fill(head, -1);
size=0;
}
void add_edge(int u,int v){
edge[size]=new Edge(v,head[u]);
head[u]=size++;
}
void dfs(int u){
for(int i=head[u];i!=-1;i=edge[i].next){
if(!edge[i].vis){
edge[i].vis=true;
dfs(edge[i].v);
}
}
System.out.println(u);
}
}
public class Main{
public static void main(String[] args){
Scanner cin = new Scanner (System.in);
while(cin.hasNext()){
Graph a=new Graph();
a.n=cin.nextInt();
a.m=cin.nextInt();
for(int i=1;i<=a.m;i++){
int u=cin.nextInt();
int v=cin.nextInt();
a.add_edge(u, v);
a.add_edge(v, u);
}
a.dfs(1);
}
}
}