1375:骑马修栅栏(fence)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
农民John每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。
John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个一个栅栏。你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。
每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点)。一个顶点上可连接任意多(≥1)个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。
你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的,等等)。 输入数据保证至少有一个解。
【输入】
第1行:一个整数F(1≤F≤1024),表示栅栏的数目;
第2到F+1行:每行两个整数i,j(1≤=i,j≤500)表示这条栅栏连接i与j号顶点。
【输出】
输出应当有F+1行,每行一个整数,依次表示路径经过的顶点号。注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。
【输入样例】
9
1 2
2 3
3 4
4 2
4 5
2 5
5 6
5 7
4 6
【输出样例】
1
2
3
4
2
5
4
6
5
7
1. #include <bits/stdc++.h> 2. using namespace std; 3. int mp[505][505];//邻接矩阵 4. int du[505];//度 5. int path[1030],k;//路径 6. int f,min_n,max_n,a,b; 7. void dfs(int x){//搜索路径 8. for(int i=min_n;i<=max_n;i++) 9. if(mp[x][i]){ 10. mp[x][i]--;mp[i][x]--; 11. dfs(i); 12. } 13. path[k++]=x; 14. } 15. int main() { 16. cin>>f; 17. min_n=0x3f3f3f3f;max_n=0; 18. for(int i=1;i<=f;i++){ 19. cin>>a>>b;//注意:两点之间可能有多条边连接 20. mp[a][b]++;mp[b][a]++; 21. du[a]++;du[b]++; 22. min_n=min(min_n,min(a,b)); 23. max_n=max(max_n,max(a,b)); 24. } 25. int start=min_n; 26. for(int i=min_n;i<=max_n;i++)//寻找最小奇点 27. if(du[i]%2) {start=i;break;} 28. dfs(start); 29. for(int i=k-1;i>=0;i--) cout<<path[i]<<endl; 30. return 0; 31. }