Codeforces Round #296 (Div. 2)E. Data Center Drama (欧拉路)

    技术2024-07-22  65

    题目链接

    题面:

    题意: 给定一张无向连通图,你需要添加最少的边并且给每条边定向使得每个点的入度和出度都是偶数。

    into groups of two 一度在纠结是分成两组,还是每组两个。。。。。 导致读题没读懂。

    题解: 考虑欧拉回路。 在欧拉图中,每个点的度数都是偶数,所以我们可以先把他构成一张欧拉图(奇数顶点一定有偶数个,两两连边即可),因为每个点入度和出度都是偶数,那么每个点总度数都是一定是偶数,至少要把当前的图变为欧拉图。

    若欧拉回路的长度为偶数,例如 a-b-c-d-a 那么 a–>b , b <-- c , c–>d d<–a 即可满足要求 若欧拉回路的长度为奇数,例如 a-b-c-a , 那么在起点处加一个自环即可。

    代码:

    #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<queue> #include<bitset> #include<map> #include<unordered_map> #include<set> #define ui unsigned int #define ll long long #define llu unsigned ll #define ld long double #define pr make_pair #define pb push_back #define lc (cnt<<1) #define rc (cnt<<1|1) #define len(x) (t[(x)].r-t[(x)].l+1) #define tmid ((l+r)>>1) #define forhead(x) for(int i=head[(x)];i;i=nt[i]) #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)>(y)?(y):(x)) #define one(n) for(int i=1;i<=(n);i++) #define rone(n) for(int i=(n);i>=1;i--) #define fone(i,x,n) for(int i=(x);i<=(n);i++) #define frone(i,n,x) for(int i=(n);i>=(x);i--) #define fonk(i,x,n,k) for(int i=(x);i<=(n);i+=(k)) #define fronk(i,n,x,k) for(int i=(n);i>=(x);i-=(k)) #define two(n,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++) #define ftwo(i,n,j,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++) #define cls(a) memset(a,0,sizeof(a)) #define cls1(a) memset(a,-1,sizeof(a)) #define clsmax(a) memset(a,0x3f,sizeof(a)) #define clsmin(a) memset(a,0x80,sizeof(a)) #define cln(a,num) memset(a,0,sizeof(a[0])*num) #define cln1(a,num) memset(a,-1,sizeof(a[0])*num) #define clnmax(a,num) memset(a,0x3f,sizeof(a[0])*num) #define clnmin(a,num) memset(a,0x80,sizeof(a[0])*num) #define sc(x) scanf("%d",&x) #define sc2(x,y) scanf("%d%d",&x,&y) #define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define scl(x) scanf("%lld",&x) #define scl2(x,y) scanf("%lld%lld",&x,&y) #define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z) #define scf(x) scanf("%lf",&x) #define scf2(x,y) scanf("%lf%lf",&x,&y) #define scf3(x,y,z) scanf("%lf%lf%lf",&x,&y,&z) #define scs(x) scanf("%s",x+1) #define scs0(x) scanf("%s",x) #define scline(x) scanf("%[^\n]%*c",x+1) #define scline0(x) scanf("%[^\n]%*c",x) #define pcc(x) putchar(x) #define pc(x) printf("%d\n",x) #define pc2(x,y) printf("%d %d\n",x,y) #define pc3(x,y,z) printf("%d %d %d\n",x,y,z) #define pck(x) printf("%d ",x) #define pcl(x) printf("%lld\n",x) #define pcl2(x,y) printf("%lld %lld\n",x,y) #define pcl3(x,y,z) printf("%lld %lld %d\n",x,y,z) #define pclk(x) printf("%lld ",x) #define pcf2(x) printf("%.2f\n",x) #define pcf6(x) printf("%.6f\n",x) #define pcf8(x) printf("%.8f\n",x) #define pcs(x) printf("%s\n",x+1) #define pcs0(x) printf("%s\n",x) #define pcline(x) for(int i=1;i<=15;i++) pcc(x);pcc('\n') using namespace std; const int inf=0x3f3f3f3f; const ll lnf=0x3f3f3f3f3f3f3f3f; const double dnf=1e18; const int mod=1e9+7; const double eps=1e-8; const double pi=acos(-1.0); const int maxm=100100; const int up=100000; const int hp=13331; const int maxn=1000100; int head[maxn],edge[maxn],ver[maxn],nt[maxn],tot=1; int d[maxn],ans[maxn],cnt=0; bool ha[maxn]; void add(int x,int y,int z=0) { ver[++tot]=y,edge[tot]=z; nt[tot]=head[x],head[x]=tot; } void dfs(int x) { for(int i=head[x];i;i=head[x]) { head[x]=nt[i]; if(ha[i]) continue; ha[i]=ha[i^1]=true; dfs(ver[i]); ans[++cnt]=ver[i]; } } int main(void) { int n,m,res=0; sc2(n,m); res=m; int x,y; one(m) { sc2(x,y); add(x,y),add(y,x); d[x]++,d[y]++; } int pre=0; one(n) { if(d[i]&1) { if(pre) add(pre,i),add(i,pre),res++,pre=0; else pre=i; } } if(res&1) add(1,1),add(1,1),res++; dfs(1); ans[++cnt]=1; pc(res); one(cnt-1) { if(i&1) pc2(ans[i],ans[i+1]); else pc2(ans[i+1],ans[i]); } return 0; }
    Processed: 0.021, SQL: 9