ccf 201512-4送货

来源:互联网 发布:风险矩阵图案例 编辑:程序博客网 时间:2024/04/30 04:26

手动造递归

#include<iostream>#include<vector>using namespace std;int n,m,cnt;vector<int> re; char arc[10001][10001];char ar[10001][10001];int v[10001];vector<int> all[10001];vector<int> rr;int vis[10001];void dfs(int a){    for(int t=0;t<all[a].size();++t){        int i=all[a][t];        if(!vis[i]&&ar[a][i]){            vis[i]=1;            ++cnt;            dfs(i);        }    }}int main(){    cin>>n>>m;    int a,b;    for(int i=0;i<m;++i){        cin>>a>>b;        arc[a][b]=arc[b][a]=1;        ar[a][b]=ar[b][a]=1;        v[a]++;v[b]++;    }    for(int i=1;i<=n;++i)        for(int j=1;j<=n;++j)            if(arc[i][j]) all[i].push_back(j);    a=b=0;    for(int i=1;i<=n;++i){        if(v[i]&1){            if(!a) a=i;            else if(!b) b=i;            else {cout<<-1<<endl;return 0;}        }        if(!v[i]) {cout<<-1<<endl;return 0;}    }    if(a&!b)  {cout<<-1<<endl;return 0;}    cnt=1;    vis[1]=1;    dfs(1);    if(cnt!=n){cout<<-1<<endl;return 0;}    if(!a) a=1;    re.push_back(a);     int f=0;    while(!re.empty()){        f=0;        for(int t=0;t<all[a].size();++t){            int i=all[a][t];            if(arc[a][i]){                re.push_back(i);                arc[a][i]=arc[i][a]=0;                a=i;                f=1;                break;            }        }        if(!f){            int e=re.back();            re.pop_back();                a=re.back();            rr.push_back(e);        }    }    cout<<rr.back();    for(int i=m-1;i>=0;--i)        cout<<" "<<rr[i];    cout<<endl;}