CF723E 欧拉回路

来源:互联网 发布:驾照金手指软件下载 编辑:程序博客网 时间:2024/05/29 18:54

题目大意
将无向图转为有向图,并且出度等于入度的点的数目最大。无重复边有孤立点
题解
将度数为奇数的点连接 跑欧拉回路 将 原来的边输出

#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#include <vector>using namespace std;const int maxn=205;struct Edge{    int u,v,len,nex;};Edge edge[205*205];int head[205],deg[205];int cnt,m,n;bool vis[205],vis_edge[205*205];void add(int u,int v,int w)///链式前向星{    edge[cnt].u=u;    edge[cnt].v=v;    edge[cnt].len=w;    edge[cnt].nex=head[u];    head[u]=cnt++;}vector<int>odd;void euler(int u){    vis[u]=1;    for(int i = head[u]; ~i; i=edge[i].nex) {        if(vis_edge[i|1]) continue;        vis_edge[i|1]=1;        if(edge[i].len) printf("%d %d\n",u,edge[i].v);        euler(edge[i].v);    }}int main(){    int t;    cin.tie(0);    ios::sync_with_stdio(0);    cin>>t;    while(t--)    {        cnt=0;        odd.clear();        memset(vis,0,sizeof vis);        memset(head,-1,sizeof head);        memset(vis_edge,0,sizeof vis_edge);        memset(deg,0,sizeof deg);        cin>>n>>m;        for(int i = 0; i < m; ++i) {            int u,v;            cin>>u>>v;            add(u,v,1);            add(v,u,1);            deg[u]++;            deg[v]++;        }        int ans=0;        for(int i = 1; i <= n; ++i) {            if(deg[i]&1) odd.push_back(i);            else ans++;        }        printf("%d\n",ans);        int l=odd.size();        for(int i = 0; i < l; i+=2) {            add(odd[i],odd[i+1],0);            add(odd[i+1],odd[i],0);        }        for(int i = 1; i <= n; ++i) {            if(!vis[i]) euler(i);        }    }    return 0;}
0 0
原创粉丝点击