ICPC XIV NEERC Western Subregional Contest I题

来源:互联网 发布:jre1.8 源码下载 编辑:程序博客网 时间:2024/06/09 01:39

没有开头语

这里写图片描述

题目大意

给定一个无向图,构造子图使得所有节点的度数都为奇数

思路

对于每个连通块,构造一个生成树,如果一条边连着的子节点对应的子树大小为奇数,那这条边取,否则不取,复杂度为O(n+m)

代码

#include <bits/stdc++.h>using namespace std;typedef pair<int,int>pii;vector<int>g[100005];vector<pii>ans;bool vis[100005];int dfs(int u){    int cnt=0;    vis[u]=true;    for(int i=0;i<g[u].size();i++)    {        if(!vis[g[u][i]]&&dfs(g[u][i])%2==0)        {            ans.push_back(pii(u,g[u][i]));            cnt++;        }    }    return cnt;}int main(){    freopen("oddfactor.in","r",stdin);    freopen("oddfactor.out","w",stdout);    int n,m;    memset(vis,0,sizeof vis);    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++)    {        int a,b;        scanf("%d%d",&a,&b);        g[a].push_back(b);        g[b].push_back(a);    }    bool f=true;    for(int i=1;i<=n;i++)    {        if(!vis[i]&&dfs(i)%2==0) f=false;    }    if(f)    {        printf("%d\n",ans.size());        for(int i=0;i<ans.size();i++)        {            printf("%d %d\n",ans[i].first,ans[i].second);        }    }else{        printf("-1\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击