MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 1041

Posted on 2011-08-12 16:35  MDeath-Kid  阅读(331)  评论(0编辑  收藏  举报
poj 1042
#define MAXNT 2000

#define MAXV 60


struct edge {
int to;
int va;
edge(){}
edge(
int t,int v) {to = t;va = v;}
bool operator < (const edge a) const {
return va < a.va;
}
};
vector
<edge> adj[MAXV];

int x,y,va;
int V,M,stp;
int path[MAXNT];
bool visit[MAXNT],record[MAXV];

void init() {
SET(visit,
false);
SET(record,
false);
SET(path,
0);
stp
=0;V=0;
for(int i = 0;i<MAXV;i++) {
adj[i].clear();
}
}

void dfs(int now) {

for(int i = 0;i< adj[now].size();i++) {
//if(adj[now][i].to == now) continue;
if(!visit[adj[now][i].va] && !visit[adj[now][i].va]) {
visit[adj[now][i].va]
= true;
dfs(adj[now][i].to);

path[stp
++] = adj[now][i].va;
}
}
}

void solve() {
int i,sum = 0,s=1,tmp=1;
for(i = 1;i<= V;i++)
sort(adj[i].begin(),adj[i].end());

for(i = 1;i<= V;i++) {
if(record[i])
if(adj[i].size() & 1) {
sum
++;
break;
}
}
if(sum != 0) {puts("Round trip does not exist.");return;}
dfs(s);
PCF(path[stp
-1]);
for(i = stp - 2;i>=0;i--) printf(" %d",path[i]);
puts(
"");
}

int main() {
FOPEN
while(~SCFD(x,y) && x && y) {
init();
SCF(va);
V
= max(V,max(x,y));
adj[x].push_back(edge(y,va));
adj[y].push_back(edge(x,va));
record[x]
= record[y] = true;
while(~SCFD(x,y) && x && y) {
SCF(va);
V
= max(V,max(x,y));
adj[x].push_back(edge(y,va));
adj[y].push_back(edge(x,va));
record[x]
= record[y] = true;
}
solve();
}
}

 John's trip 这个题狠吐槽啊

HOJ 提交了N次,就是WA,POJ马上过了,不知道为啥啊啊啊啊。

1.先判断是否存在欧拉路径

无向图

欧拉回路:连通 + 所有定点的度为偶数

欧拉路径:连通 + 除源点和终点外都为偶数

有向图

欧拉回路:连通 + 所有点的入度 == 出度

欧拉路径:连通 + 源点 出度-入度=1 && 终点 入度 - 出度 = 1 && 其余点 入度 == 出度;

2.求欧拉路径 :

step 1:选取起点(如果是点的度数全为偶数任意点为S如果有两个点的度数位奇数取一个奇数度点为S)

step 2:对当前选中的点的所有边扩展,扩展条件(这条边为被标记),若可扩展 ->step 2;否则 step 3;

step 3:将次边计入path结果保存。

拿第一组case来说

先对边的序号排序

排序
1 for(i = 1;i<= V;i++)
2 sort(adj[i].begin(),adj[i].end());

然后 欧拉

euler
 1 void dfs(int now) {
2
3 for(int i = 0;i< adj[now].size();i++) {
4 //if(adj[now][i].to == now) continue;
5 if(!visit[adj[now][i].va] && !visit[adj[now][i].va]) {
6 visit[adj[now][i].va] = true;
7 dfs(adj[now][i].to);
8
9 path[stp ++] = adj[now][i].va;
10 }
11 }
12 }

  具体执行的步骤:

    每次递归函数 now 的值      此时标记的边

  1                  (1)

  1  2                 (2)

  1  2  3                  (3)

  1  2  3  2                (5)

  1  2  3  2  1               (4)

  1  2  3  2  1  3             (6)

//这时所以边已被标记,开始从最后一个完成递归,下面是路径 path[] 保存的值

path [] = {6,4,5,3,2,1};

这样整个寻路就OK了。

感觉自己的思路还算清晰啊,怎么老是WA~~