很抱歉,因为最近在忙开学(本人小学六年级),我有一周没写了。在这里道个歉。我也哭笑不得~日更没了。
那么就来吧,我会尝试重启日更的~~。
1341:【例题】一笔画问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 7686 通过数: 2638
【题目描述】
如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。
根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。
【输入】
第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。
【输出】
欧拉路或欧拉回路,输出一条路径即可。
【输入样例】
5 5
1 2
2 3
3 4
4 5
5 1
【输出样例】
1 5 4 3 2 1
思路:统计各个点的总度数,各个算。起点的话,只有奇点是欧拉路,欧拉回路随便哪个点。
代码大放送:
#include <bits/stdc++.h>
using namespace std;
int n,m,go[2050],totn[1050],x,y,start=1,sum,tot;//如果是欧拉回路,是任意一点做起点
bool b[1005][1050];
void dfs(int k)
{
for(int i=1; i<=n; i++)
{
if(b[i][k])
{
b[i][k]=false;
b[k][i]=false;
dfs(i);//尝试
}
}
go[++tot]=k;//记录
}
int main()
{
cin>>n>>m;
for(int i=1; i<=m; i++)
{
cin>>x>>y;
b[x][y]=b[y][x]=true;
totn[x]++;
totn[y]++;
}//输入
for(int i=1; i<=n; i++)
{
if(totn[i]%2)
{
sum++;
if(sum==1) start=i;
}//取起点
}
dfs(start);//dfs
for(int i=1; i<=tot; i++) cout<<go[i]<<" "; //输出
cout<<endl;
return 0;
}
今天就到这吧,明天争取日更。加油!明天讲1374。
明天是周一(4.27),我得准备上课了。再见。