Freuryアルゴリズムはオラパスを求めます.
Freuryアルゴリズムはオラパスを求めます.
リラに関する問題をいくつか並べてみます.
ハイブリッド道路 poj 1637、zju 1992、hdu 3472
1 HDU 3018 Ant Trip
2 POJ 1041 John's trip
3 POJ 1386 Play on Words
4 POJ 2230 Watch Cow
5 POJ 2513 Colored Sticks
6 POJ 2337 Catenyms
7 POJ 1392 Ourobooss Snake
8 HDU 2894 DeBruijin
郵便配達問題 poj 2040 poj 2404ハミルトン回路 poj 2439 poj 2288 poj 1392 hdu 2894 hdu
3018
1116
2894
1956
3472
欧拉回路のfleuryアルゴリズムを求めて、重辺を求めることができます.
リラに関する問題をいくつか並べてみます.
ハイブリッド道路 poj 1637、zju 1992、hdu 3472
1 HDU 3018 Ant Trip
2 POJ 1041 John's trip
3 POJ 1386 Play on Words
4 POJ 2230 Watch Cow
5 POJ 2513 Colored Sticks
6 POJ 2337 Catenyms
7 POJ 1392 Ourobooss Snake
8 HDU 2894 DeBruijin
郵便配達問題 poj 2040 poj 2404ハミルトン回路 poj 2439 poj 2288 poj 1392 hdu 2894 hdu
3018
1116
2894
1956
3472
欧拉回路のfleuryアルゴリズムを求めて、重辺を求めることができます.
#include
#include
#include
#include
#include
#include
using namespace std;
const int N = 1005;
int n, m, flag, top, sum, du[N], ans[5005], map[N][N];
void dfs(int x)
{
ans[++top] = x;
for(int i = 1; i <= n; i++)
{
if(map[x][i] >= 1)
{
map[x][i]--;
map[i][x]--;
dfs(i);
break;
}
}
}
void fleury(int x)
{
top = 1;
ans[top] = x;
while(top > 0)
{
int k = 0;
for(int i = 1; i <= n; i++)//
{
if(map[ans[top]][i] >= 1)// ans[top]
{k = 1; break;}
}
if(k == 0)// x ( ),
{
printf("%d ", ans[top]);
top--;
}
else if(k == 1)// , dfs
{
top--;//
dfs(ans[top+1]);
}
}
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
memset(du, 0, sizeof(du));
memset(map, 0, sizeof(map));
for(int i = 1; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
map[x][y]++; // , ,
map[y][x]++;
du[x]++;
du[y]++;
}
flag = 1; // flag 。 1
sum = 0;
for(int i = 1; i <= n; i++)
{
if(du[i] % 2 == 1)
{
sum++;
flag = i;// ,
}
}
if(sum == 0 || sum == 2)
fleury(flag);
}
return 0;
}