这道题,初看觉得只是一般的图论问题,不过深究起来,还真是有点意思啊~(经过N次WA试验后得出的结论)
话不多说,先看看题目:
1001: 一笔画
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Description
对给定的一个无向图,判断能否一笔画出。若能,输出一笔画的先后顺序,否则输出“No Solution!”
所谓一笔画出,即每条边仅走一次,每个顶点可以多次经过。
输出字典序最小的一笔画顺序。
Input
包含多组测试数据。
第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。(n<=100)
Output
每组测试数据占一行。一笔画的先后顺序,每个顶点之间用一个空格分开。
如果不能完成一笔画,则输出“No Solution!”
Sample Input
3 3
1 2
1 3
2 3
5 5
1 2
2 3
3 4
4 5
5 1
Sample Output
1 2 3 1
1 2 3 4 5 1
这道题其实是由一道最普通的一笔画图论问题延伸而来的。特别之处在于:
1.需要你在无解情况下输出“No Solution!”。
2.要求你在有多种解的情况下输出字典序最小的一组。
先撇开这道题,看看没有这两点要求下的代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 101
int g[maxn][maxn];//二维数组进行链式储存
int du[maxn];//记录每个点的度,以便于最终判断奇点数目
int circuit[maxn];//记录欧拉路的路径
int n,e,circuitpos,i,j,x,y,start;
void find_circuit(int i)
{
int j;
for(j=1;j<=n;j++)
if(g[i][j]==1){
g[i][j]=g[j][i]=0;find_circuit(j);}//这个点搜寻完毕,标记搜寻后继续寻找以j为起点的剩下边
circuit[++circuitpos]=i;//记录路径
}
int main()
{
while(cin>>n>>e)
{
memset(g,0,sizeof g);memset