0
点赞
收藏
分享

微信扫一扫

A1126 Eulerian Path (25 分| 连通图,附详细注释,逻辑分析)


写在前面

  • 思路分析
  • 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;
}


举报

相关推荐

0 条评论