#493. 蚂蚁之旅
描述
提交
自定义测试
【题目描述】:
给你无向图的N个点和M条边,保证这M条边都不同且不会存在同一点的自环边,现在问你至少要几笔才能所有边都画一遍。(一笔画的时候笔不离开纸)
【输入描述】:
多组数据,每组数据用空行隔开。
对于每组数据,第一行两个整数N,M表示点数和边数。接下去M行每行两个整数a,b ,表示a,b之间有一条边。
【输出描述】:
对于每组数据,输出答案。
【样例输入】:
3 3
1 2
2 3
1 3
4 2
1 2
3 4
【样例输出】:
1
2
【时间限制、数据范围及描述】:
时间:1s 空间:64M
1<=N<=105;0<=M<=2×105;1<=a,b<=N
中文
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
const int MAXN=1005,MAXM=5024;
int n,m,p[MAXN][MAXN],du[MAXN],ans[MAXM],cnt,s;
bool vis[MAXM];
const int MAXN=100005,MAXM=1000005;
int t,n,m,p[MAXN],cnt,in[MAXN],out[MAXN],ans[MAXM],san;
bool vis[MAXM];
struct cyq{
int v,next,flag;
}a[MAXM];
int get(){
char cc=getchar();
int res=0;
while (cc<'0'||cc>'9') cc=getchar();
while (cc>='0'&&cc<='9'){
res=(res<<3)+(res<<1)+cc-'0';
cc=getchar();
}
return res;
}
void add(int u,int v,int fl){
a[++cnt].v=v;
a[cnt].flag=fl;
//if(t==1) a[cnt].nod=(cnt+fl)/2;
//else a[cnt].nod=cnt;
a[cnt].next=p[u];
p[u]=cnt;
}
void dfs(int now){
for(int &i=p[now];i;i=a[i].next){
//p[now]=a[i].next;
int kk=i;
if(!vis[i]){
vis[i]=1;
if(t==1){
if(a[i].flag==0) vis[i-1]=1;
if(a[i].flag==1) vis[i+1]=1;
}
dfs(a[i].v);
ans[++san]=kk;
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
int x,y;cher();
for(int i=1;i<=m;i++){
x=get();y=get();n=max(max(x,y),n);
++p[x][y];++p[y][x];
++du[x];++du[y];
}s=1;
for(int i=1;i<=n;i++)
if(du[i]%2) {
s=i;
break;
}
dfs(s);
for(int i=cnt;i>=1;i--)
printf("%d\n",ans[i]);
}
return 0;
}