题意:有n(2<=n<=10000)个地点,m(1<=m<=50000)条路,两点之间可有多条路,小女孩要将这m条路各走两次且每条路都是从不同方向走一次。
思路:求有向图的欧拉回路,一开始我用road[i][j]记录从i到j方向的未走的路的数,空间复杂度10000*10000,爆了,要用邻接表读入数据,这样大概空间复杂度为2*50000
#include
#include
#include
using namespace std;
vector
list[10005];
int num[10005];
void euler(int s)
{
if(!num[s]) return;
//取出与s直接相连的一个点,不再考虑这条路
num[s]--;
int cur = list[s][num[s]];
euler(list[s][num[s]]);
printf("%d\n", cur); //对顺序要求不高,不需要栈,直接输出
if(num[s]) euler(s); //还有与s直接相连的点,即从s出发还有路要走
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int n, m, u, v;
while(scanf("%d%d", &n, &m) != EOF)
{
memset(num, 0, sizeof(num));
while(m--)
{
scanf("%d%d", &u, &v);
list[u].push_back(v); num[u]++;
list[v].push_back(u); num[v]++;
//printf("u=%d,v=%d\n",u, v);
}
euler(1);
printf("1\n");
}
return 0;
}