P6066 [USACO05JAN]Watchcow S

· · 题解

需要知识点:

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v;
vector<int> ve[10002];
queue<int> ans;
//这里就是一个朴实无华的深搜,就只是用了欧拉回路的思路,反正他会回来,每次删边就行
void dfs(int f){
    int len=ve[f].size();
    for(int i=0;i<len;++i){
        int xn=ve[f][i];
        if(xn){
            //删边
            ve[f][i]=0;
            dfs(xn);
        }
    }
    //ans是用来存最终的顺序的
    ans.push(f);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i){
        scanf("%d%d",&u,&v);
        //双向建边
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
    //从1号点开始dfs
    dfs(1);     
    //输出,每次输出都出队
    while(!ans.empty()) {
        printf("%d\n",ans.front());
        ans.pop();
    }
    //朴实无华的结束
    return 0;
}

对代码的补充说明

在代码第五行我使用了队列来存储最后的答案,这个方法只是偷了个懒,没有算如果用数组最多要开多大,那接下来就算一下。

首先题中明确给出了边的最大数量也就是 M1 \leq M \leq 5 \times 10^4),又因为这里每条边要走两次,相当于 2M 条边,从起点出发,每走一条边,就会扩展一个点,再加上起点,欧拉回路最终会有 2M+1 个点,也就是 100001 个点,因为我的数组要从下标一开始存,所以数组的空间要开到 100002