Codeforces 405 E. Graph Cutting ( DFS )

这道题是用dfs搜索的,如果有奇数条边那么直接就No solution,其实一共就两种情况,否则的话就剩下一个子那么就找他父亲和他父亲的父亲一起配对就行了
我们先找到now的相连的点的数量,然后对这些相连的点进行dfs,直到找到叶子节点,如果找到了就输出,没找到就放进队列里然后返回,然后大概就是这样一个过程,最近采用vector写代码,感觉还是蛮好用的,值得推荐*

#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
const int T=1e5+5;
struct node
{
    int num,x;
}t;
vector<node> p[T];
bool flag[T];
int dfs(int now)
{
    queue<int>q; // 注意==>是每个节点都有一个队列
    int l=p[now].size();
    for(int i=0;i<l;i++)
    {
        node k=p[now][i];
        if(flag[k.num])
            continue;
        else flag[k.num]=1;
        int r=dfs(k.x);
        if(r)
            printf("%d %d %d\n",now,k.x,r);
            else q.push(k.x);
    }
    while(q.size()>=2)
    {
        int v1=q.front();
        q.pop();
        int v2=q.front();
        q.pop();
        printf("%d %d %d\n",v1,now,v2);
    }
    while(!q.empty())
    {
        int v3=q.front();
        q.pop();
        return v3;// 如果队列里面有剩余,则将此队列里的点返回回去和其父节点,父节点的父节点构成一个子图
    }
    return 0;
}
int main()
{
    int n,m,a,b;
   while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0; i<n; i++)
            p[i].clear();
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&a,&b);
            t.num=i;//为每条边标记序号,方便查找该边是否走过
            t.x=a;
            p[b].push_back(t);
            t.x=b;
            p[a].push_back(t);
        }
        if(m%2==1)
            printf("No solution\n");
        else
        {
            memset(flag,0,sizeof(flag));
            dfs(1);
        }
    }
    return 0;
}

你可能感兴趣的:(搜索,DFS,codeforces)