Hdu 5348 MZL's endless loop (dfs)

本文探讨了一种将无向图中的边赋予方向的方法,确保每个顶点的出入度之差不超过2。通过DFS遍历图,并根据当前顶点的出入度情况决定边的方向,最终实现所有顶点的出入度差符合要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

  Hdu 5348 MZL's endless loop

题目描述:

  给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)<2。如果能输出任意一种合法方案。

解题思路:

  其实仔细考虑一下,每个无向图都会存在合法方案的。证明:度数和为奇数的点只能为起点或者终点,度数为偶数的只能是环上的起点或者终点或者是中间点。有m条边,一共有2*m个端点。所以呢?当然是度数和为奇数的个肯定是偶数个,任意两个相结合都可以形成一条路。并不会有两条路的起点相同或者终点相同咯。

  由上可知所给的无向图是由若干条路径和若干个环组成的,我们可以对每个点进行dfs,当前遍历的点入度大于出度就正向遍历,否则反向遍历,直到遍历不到边为止。每遍历到一条边就将其删去,遇到环就回溯到环的起点。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #pragma comment (linker, "/STACK:102400000,102400000")
 6 using namespace std;
 7 
 8 const int maxn = 100005;
 9 struct node
10 {
11     int to, next, id;
12 }edge[maxn*6];
13 int head[maxn], du[2][maxn], sum[maxn];
14 int vis[maxn*6], ans[maxn*6], tot;
15 
16 void init ()
17 {
18     tot = 0;
19     memset (head, -1, sizeof(head));
20     memset (du, 0, sizeof(du));
21     //du[0][i]i点的入度,du[1][i]i的出度
22     memset (sum, 0, sizeof(sum));
23     //sum[i]i的度数总和
24     memset (vis, 0, sizeof(vis));
25     //边是否遍历过
26     memset (ans, -1, sizeof(ans));
27 }
28 void Add (int from, int to, int id)
29 {
30     edge[tot].to = to;
31     edge[tot].id = id;
32     edge[tot].next = head[from];
33     head[from] = tot ++;
34 }
35 void dfs (int u, int y)
36 {
37     for (int i=head[u]; i!=-1; i=edge[i].next)
38     {
39         if (vis[i])
40         {//当前边已经被访问过
41             head[u] = edge[i].next;
42             //删边
43             continue;
44         }
45         int v = edge[i].to;
46         if (v!=u && du[y][v]<du[y^1][v])
47             //当前点若和u相连,abs(出度-入度)>1
48             continue;
49         vis[i] = vis[i^1] = 1;
50         if (i % 2)
51             ans[i/2] = y^1;
52         else
53             ans[i/2] = y;
54         du[y][u] ++;
55         du[y^1][v] ++;
56         head[u] = edge[i].next;
57         dfs (v, y);
58         break;
59     }
60 }
61 int main ()
62 {
63     int t, n, m;
64     scanf ("%d", &t);
65     while (t --)
66     {
67         scanf ("%d %d", &n, &m);
68         init ();
69         for (int i=0; i<m; i++)
70         {
71             int u, v;
72             scanf ("%d %d", &u, &v);
73             Add (u, v, i);
74             Add (v, u, i);
75             sum [u] ++;
76             sum [v] ++;
77         }
78         for (int i=1; i<=n; i++)
79         {
80             while (du[0][i] + du[1][i] < sum[i])
81             {
82                 if (du[0][i] <= du[1][i])
83                     dfs (i, 0);
84                 else
85                     dfs (i, 1);
86             }
87         }
88         for (int i=0; i<m; i++)
89             printf ("%d\n", ans[i]);
90     }
91     return 0;
92 }

 

转载于:https://www.cnblogs.com/alihenaixiao/p/4704074.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值