欧拉路径 O(E)

| 欧拉路径 O(E)
| INIT: adj[][] 置为图的邻接表 ; cnt[a] a 点的邻接点个数 ;
| CALL: elpath(0); 注意 : 不要有自向边
\*==================================================*/
int adj[V][V], idx[V][V], cnt[V], stk[V], top;
int path( int v){
for ( int w ; cnt[v] > 0; v = w) {
stk[ top++ ] = v;
w = adj[v][ --cnt[v] ];
adj[w][ idx[w][v] ] = adj[w][ --cnt[w] ];
// 处理的是无向图 —- 边是双向的,删除 v->w 后,还要处理删除 w->v
}
return v;
}
void elpath ( int b, int n){ // begin from b
int i, j;
for (i = 0; i < n; ++i) // vertex: 0 ~ n-1
for (j = 0; j < cnt[i]; ++j)
idx[i][ adj[i][j] ] = j;
printf( "%d" , b);
for (top = 0; path(b) == b && top != 0; ) {
b = stk[ --top ];
printf( "-%d" , b);
}
printf( "\n" );
}

你可能感兴趣的:(java,算法,前端)