写在前面
- 思路分析
- Eulerian图
- 连通图
- 所有结点度为偶数
- Semi-Eulerian图
- 连通图
- 仅有2个结点的度是奇数其他都是偶数
- 邻接表存储图,计算每个结点的度
- 图的连通性
- 深搜判断连通性,从结点1开始深搜,统计连通结点个数cnt != n说明是不是连通图,输出Non-Eulerian
- 问题点
-
first print in a line the degrees of the vertices in ascending order of their indices.
- 索引升序
- 英文单词
-
odd degree : 奇数度
-
even degree : 偶数度
- DFS知识盲点,图盲点
- 后续复习
- 参考大神代码代码
测试用例
input:
7 12
5 7
1 2
1 3
2 3
2 4
3 4
5 2
7 6
6 3
4 5
6 4
5 6
output:
2 4 4 4 4 4 2
Eulerian
input:
6 10
1 2
1 3
2 3
2 4
3 4
5 2
6 3
4 5
6 4
5 6
output:
2 4 4 4 3 3
Semi-Eulerian
input:
5 8
1 2
2 5
5 4
4 1
1 3
3 2
3 4
5 3
output:
3 3 4 3 3
Non-Eulerian
ac代码
- 参考链接
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> v;
vector<bool> visit;
int cnt = 0;
void dfs(int index)
{
visit[index] = true;
cnt++;
for(int i=0; i<v[index].size(); i++)
if(visit[v[index][i]] == false)
dfs(v[index][i]);
}
int main()
{
int n, m, a, b, even = 0;
scanf("%d%d", &n, &m);
v.resize(n+1);
visit.resize(n+1);
for(int i=0; i<m; i++)
{
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1; i<=n; i++)
{
if(i!=1) printf(" ");
printf("%d", v[i].size());
if(v[i].size()%2==0) even++;
}
printf("\n");
dfs(1);
if(even == n && cnt == n)
printf("Eulerian");
else if(even==n-2 && cnt==n)
printf("Semi-Eulerian");
else
printf("Non-Eulerian");
return 0;
}