AGC 013 B Hamiltonish Path 模拟(deque)

来源:互联网 发布:北京大学软件学院 编辑:程序博客网 时间:2024/05/29 02:25

点击打开链接

题意:n<=1e5的图 找到path满足 每个点只经过一次 && 和endpoint(起/终)点相邻的点都包含在路径中
任意两个相邻点作为endpoint,并放入双端队列中,遍历u的相邻点,若存在v没被访问,则令v为起点 继续模拟 因为一定有解,复杂度为O(M) 

#include <bits/stdc++.h>using namespace std;const int N=2e5+20;int n,m;vector<int> e[N];int q[N],f,r; //deque,保存起点和终点 int vis[N];int check(int u){for(int i=0;i<e[u].size();i++){int v=e[u][i];if(!vis[v])return v;//更改v作为起点 }return -1;}int main(){while(cin>>n>>m){bool flag=true;//firstfor(int i=1;i<=n;i++)e[i].clear(),vis[i]=0;int u,v;f=1e5;//r=1e5+1;while(m--){scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);if(flag){flag=false;vis[u]=vis[v]=1;q[f]=u;q[r]=v;}}while(true){int u=check(q[f]);if(u==-1)break;else{q[--f]=u;vis[u]=1;}}while(true){int u=check(q[r]);if(u==-1)break;else{q[++r]=u;vis[u]=1;}}cout<<r-f+1<<endl;while(f<=r)printf("%d ",q[f++]);cout<<endl;}return 0;}


0 0