Codeforces Round #375 (Div. 2)E. One-Way Reform

题目链接:传送门

题目大意:一副无向图,要求你给边定向(变为有向图),使出度等于入度的点最多,输出有多少

     个点,并且输出定向后的边(前为起点,后为终点)

题目思路:欧拉路

     我们这样考虑,先考虑无向图的点的度数,如果为奇数则一定无法变为题目要求的点,ans-1

     对于度为偶数的点则一定可以通过调整满足。

处理方法:新建一个虚拟节点0,使所有度为奇数的点向其连一条边,那么最终图中的点的度数都为偶数。

     这样就满足欧拉路的条件了。我们只需要跑欧拉路并且将走过的路径保留下来即可。

     注意将与虚拟节点连的边删去。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <cstring>
 7 #include <stack>
 8 #include <cctype>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <set>
13 #include <map>
14 #include <climits>
15 #define lson rt<<1,l,mid
16 #define rson rt<<1|1,mid+1,r
17 #define fi first
18 #define se second
19 #define ping(x,y) ((x-y)*(x-y))
20 #define mst(x,y) memset(x,y,sizeof(x))
21 #define mcp(x,y) memcpy(x,y,sizeof(y))
22 using namespace std;
23 #define gamma 0.5772156649015328606065120
24 #define MOD 1000000007
25 #define inf 0x3f3f3f3f
26 #define N 50005
27 #define maxn 30010
28 typedef pair<int,int> PII;
29 typedef long long LL;
30 LL read(){
31     LL x=0,f=1;char ch=getchar();
32     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
33     while(ch>=‘0‘&&ch<=‘9‘){x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();}
34     return x*f;
35 }
36
37 int n,m,k,ans,in[205];
38 int vis[205][205];
39 set<int>S[205];
40 vector<PII >V;
41 void dfs(int u){
42     while(S[u].size()){
43         int x=*S[u].begin();S[u].erase(S[u].begin());
44         if(vis[u][x])continue;
45         vis[u][x]=vis[x][u]=1;
46         V.push_back(make_pair(u,x));
47         dfs(x);
48     }
49 }
50 int main(){
51     int i,j,group,x,y,v,Case=0;
52     group=read();
53     while(group--){
54         n=read(),m=read();
55         mst(in,0);V.clear();
56         mst(vis,0);
57         for(i=0;i<=n;++i) S[i].clear();
58         for(i=1;i<=m;++i){
59             x=read(),y=read();
60             S[x].insert(y),S[y].insert(x);
61             ++in[x],++in[y];
62         }
63         int ans=n;
64         for(i=1;i<=n;++i)if(in[i]&1){
65             --ans;
66             S[0].insert(i),S[i].insert(0);
67         }
68         for(i=1;i<=n;++i)
69             if(S[i].size())
70                 dfs(i);
71         printf("%d\n",ans);
72         for(PII u:V)if(u.fi!=0&&u.se!=0){
73             printf("%d %d\n",u.fi,u.se);
74         }
75     }
76     return 0;
77 }
时间: 2024-10-17 23:55:41

Codeforces Round #375 (Div. 2)E. One-Way Reform的相关文章

Codeforces Round #375 (Div. 2) D. Lakes in Berland DFS

D. Lakes in Berland 链接: http://codeforces.com/problemset/problem/723/D 题意 给你一个n/*m的矩阵,然后你们有不少于k条湖泊,然后你需要使得一些湖泊变成陆地,使得湖泊的数量恰好等于k,问你至少填多少个水. 湖泊不与外界相邻. 题解: 直接dfs搜出每一条湖泊,然后放在优先队列里,从小到大去填满就好了. 代码: 1 #include<iostream> 2 #include<queue> 3 #include&l

Codeforces Round #375 (Div. 2) A

Description There are three friend living on the straight line Ox in Lineland. The first friend lives at the point x1, the second friend lives at the point x2, and the third friend lives at the point x3. They plan to celebrate the New Year together,

Codeforces Round #375 (Div. 2)

这是我打的第一场现场CF,才涨了4分= =,太菜啦.. 第一题,超级大水题,不说了.. 第二题,也挺水的,要注意的是,最后一个字符如果不是下划线或者括号结束的话,仍然要判断那个单词.因为这点WA了好多次. 第三题,rejudge的时候错了= =..题目意思有点晦涩,其实还是比较水的题,题目要求前m个组合唱的歌的数目的最小值要最大,那么这个最大值很显然是n/m,向下取整,然后从1遍历到n,如果数字大于m的或者小于等于m但是其出现的次数过多的(大于n/m)都把它变成不足n/m次的数字,然后我当时因为

Codeforces Round #375 (Div. 2) B

Description Modern text editors usually show some information regarding the document being edited. For example, the number of words, the number of pages, or the number of characters. In this problem you should implement the similar functionality. You

Codeforces Round #375 (Div. 2) C

Description Polycarp is a music editor at the radio station. He received a playlist for tomorrow, that can be represented as a sequence a1, a2, ..., an, where ai is a band, which performs the i-th song. Polycarp likes bands with the numbers from 1 to

Codeforces Round #375 (Div. 2) ABCDE

A - The New Year: Meeting Friends 水 #include<iostream> #include<algorithm> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<max(a,max(b,c)) - min(a,min(b,c)) <<endl; return 0; } B - Text Document A

Codeforces Round #375 (Div. 2) A B C D F

A 数轴上有三个人要到一个点去过年 使三个人走路距离的和最小  让两边的人都走到中间那个点即可 B 给出一个字符串 其中有_ ( ) 三种字符和英文字母 连续的英文字母是一个单词 括号对中不会套括号对 求 括号外最长的单词长度 括号内有多少单词 维护一个bool变量表示当前单词在不在括号内 res表示当前单词的长度 可见 _() 都是分隔符 C 给出一个节目表 其中有n个曲目 每一个ai 代表这个曲目由ai乐队演奏 但是某人只喜欢标号是1-m的乐队 现在他可以对每个节目的乐队进行更换 问 最少更

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i