图论
作者:
Juan
,
2021-08-10 08:23:36
,
所有人可见
,
阅读 330
//图的深搜
void bfs(int i)
{
v[i] = true;
for(int j=1;j<=num[i];j++) //num是i所连接的点的个数
if(!v[g[i][j]]) //g[i][j]是i连接的第j个点
dfs(g[i][j]); //从i连接的第j个点继续遍历
}
signed main()
{
for(int i=1;i<=n;i++) //从每个点遍历一次,不保证从一个点能遍历全图
if(!v[i]) //这个点没遍历过
dfs(i);
}
//哈密尔顿环
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m, k, l;
int num[N], g[N][N], ans[N];
bool v[N], v1[N];
void print()
{
int i;
for(i = 1; i < l; i ++ )
cout<<ans[i]<<' ';
cout<<ans[l]<<endl;
}
void dfs(int la, int i)
{
v[i] = 1, v1[i] = 1;
ans[ ++ l] = i;
for(int j=1;j<=num[i];j++)
{
if(g[i][j] == k && g[i][j] != la)
{
ans[ ++ l] = g[i][j];
print();
l -- ;
break;
}
if(!v[g[i][j]])
dfs(i, g[i][j]);
}
l -- ;
v[i] = 0;
v1[i] = 0; //若只需以一个起点的做法需删掉此回溯
//加上则是全部起点都尝试的做法
//回溯
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x, y;
cin>>x>>y;
g[x][ ++ num[x]] = y;
g[y][ ++ num[y]] = x;
}
for(k = 1; k <= n; k ++ )
if(!v1[k])
l = 0, dfs(0, k);
}