首页 > 代码库 > CCF 201512-4 送货(错误)

CCF 201512-4 送货(错误)

直接用DFS深搜,检查了好久没能发现错误,贴上来以后慢慢看。。。

/*
DFS深度优先搜索
Edge保存边  u{v,been}
cnt记录走过的街道
如果没有就return ;继续递归
*/
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstdio>
#define MAXN 10001
using namespace std;
struct Edge
{
    int v;
    Edge(int _v=0):v(_v){}
};
vector<Edge> E[MAXN];
inline void addedge(int u,int v)
{
    E[u].push_back(Edge(v));
}
int n,m,k=0;
int cnt = 0;//记录走过的边的个数
int route[MAXN];
bool been[MAXN][MAXN];
bool f = false;
void print()
{
    for(int i=0;i<k;i++)
    {
        if(i) cout<< ;
        cout<<route[i];
    }
    //cout<<endl;
}
void dfs(int i)
{
    if(f)
        return ;
    if(cnt==m)
    {
        f = true;
        route[k++]= i;
        print();
        return ;
    }
    if(!E[i].size())
        return ;
    for(int j=0;j<E[i].size();j++)
    {
        int v=E[i][j].v;
        if(!been[i][v])
        {
            route[k++] = i;//记录路径
            been[i][v]=been[v][i]=true;//标记
            cnt++;//走过数量+1
            dfs(v);
            cnt--;
            been[i][v]=been[v][i]=false;
            k--;
        }
    }
}
int main()
{
    int x,y;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&x,&y);
        addedge(x,y);
        addedge(y,x);
    }
    dfs(1);
    if(!f)
        cout<<-1<<endl;
    return 0;
}

 

CCF 201512-4 送货(错误)