题目大意:
输入两个数n, m; 表示有0到n-1个节点,m条边; 问?从某一个节点从出发最多能走多少条边(每条边只能走一次);
题目分析:
枚举所有节点,回溯计算从该节点出发最多能经过几条边;
for i = 0 to n-1 //枚举所有节点;
dfs(i, 0); // 回溯计算从该节点出发所能经过的最大边数:
那么dfs函数中的内容应该怎么写呢?
很简单,枚举就好了;
void dfs(int x, int cur){ //cur 表示经过的边数;
if(ans < cur)
ans = cur;
for(unsigned i = 0; i < edge[x].size(); ++i){ //枚举和节点i所连的所有边;
int v = edge[x][i];
if(!vis[x][v]){ 如果之前没有访问过,进行访问:
vis[x][v] = vis[v][x] = 1;
dfs(v, cur+1);
vis[x][v] = vis[v][x] = 0;
}
}
return ;
}
完整代码:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int vis[30][30];
int n, m, ans;
vector<int> evec[30];
void dfs(int x, int cur){
if(ans < cur)
ans = cur;
for(unsigned i = 0; i < evec[x].size(); ++i){
int v = evec[x][i];
if(!vis[x][v]){
vis[x][v] = vis[v][x] = 1;
dfs(v, cur+1);
vis[x][v] = vis[v][x] = 0;
}
}
return ;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF){
if(!n && !m) break;
ans = 0;
for(int i = 0; i < 30; ++i)
evec[i].clear();
memset(vis, 0, sizeof(vis));
int u, v;
for(int i = 0; i < m; ++i){
scanf("%d%d", &u, &v);
evec[u].push_back(v);
evec[v].push_back(u);
}
for(int i = 0; i < n; ++i){
dfs(i, 0);
}
printf("%d\n", ans);
}
return 0;
}