#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());
然后 欧拉
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~~