51nod 1967路径定向(dfs、欧拉回路)

1967 路径定向

基准时间限制:1.2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题

给出一个有向图,要求给每条边重定向,使得定向后出度等于入度的点最多,输出答案和任意一种方案

Input
第一行两个正整数N,M,表示1-N号点与M条边
接下来M行,每行两个正整数Xi,Yi,表示存在一条有向边从Xi指向Yi
N≤10^5,   M≤3*10^5,   Xi,Yi≤N
Output
第一行一个整数Ans,表示定向后出度等于入度的最大点数
第二行一个长度为M的01字符串,第i位为0表示第i条边不改向,第i位为1表示第i条边改变方向
Input示例
7 7
1 2
2 3
2 3
4 5
1 5
6 7
6 7
Output示例
5
0010110

题解:奇点不可能入度等于出度,所以最大点数即偶点个数。因为奇点个数为偶数,可以将奇点相连使得都变为偶点,dfs求欧拉回路。

注意:这题卡时间,输出别用printf,用putchar

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int M = 4e5+5;
 4 const int N = 1e5+5;
 5 vector<int>g[N];//每个点连哪些边
 6 vector<int>a;//奇点
 7 struct node {
 8     int u, v;
 9 }e[M];//每条边连哪些点
10 int vis[M];//走欧拉图时标记边状态,1保持不变,2改变方向
11 int du[N];//度数
12 void dfs(int x) {
13     int num = g[x].size();
14     for(int i = 0; i < num; ++i) {
15         int j = g[x][i];
16 
17         if(vis[j]) continue;
18 
19         int u = e[j].u;
20         if(u == x) vis[j] = 1;
21         else vis[j] = 2;
22 
23         //printf("%d:%d->%d...%d->%d\n",x, u, e[j].v, x, u==x?e[j].v:u);
24         if(u == x) dfs(e[j].v);
25         else dfs(u);
26     }
27 }
28 int main() {
29     int n, m, i, j, u, v;
30     scanf("%d%d", &n, &m);
31     memset(vis, 0, sizeof(vis));
32     memset(du, 0, sizeof(du));
33     for(i = 1; i <= m; ++i) {
34         scanf("%d%d", &u, &v);
35         e[i].u = u;
36         e[i].v = v;
37         g[u].push_back(i);
38         g[v].push_back(i);
39         du[u]++;  du[v]++;
40     }
41     for(i = 1; i <= n; ++i) if(du[i]&1) a.push_back(i);
42     int num = a.size();
43     printf("%d\n", n - num);
44 
45     int t = m;
46     for(i = 0; i < num; i += 2) {
47         e[++t].u = a[i];
48         e[t].v = a[i+1];
49         g[a[i]].push_back(t);
50         g[a[i+1]].push_back(t);
51     }
52     //puts("");
53     for(i = 1; i <= n; ++i) dfs(i);
54 
55     for(i = 1; i <= m; ++i) {
56         if(vis[i] == 2) putchar('1');
57         else putchar('0');
58     }
59     puts("");
60     return 0;
61 }
640ms

 

posted @ 2018-04-03 23:24  GraceSkyer  阅读(361)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……