一开始在有没有横向边的问题上纠结,后来又卡在数据结构的表示上。。。真心菜的不能看,只好从思路到数据结构都借鉴别人的吧
#include <cstdio> #include <iostream> #include <vector> #include <bitset> using namespace std; const int MAXN = 2005; vector<int> ee[MAXN], dd[MAXN]; bitset< MAXN > aa[MAXN]; int m, n, res; int vis[MAXN]; void dfs(int u, int pre) { vis[u] = 1; aa[u].reset(); for (int i = 0; i< dd[u].size(); ++i) { int v = dd[u][i]; if (vis[v]) aa[u][v] = 1; } for (int i = 0; i< ee[u].size(); ++i) { int v = ee[u][i]; if (v!=pre) { dfs(v, u); } } if (pre == -1) return; else if (aa[u].test(pre)) ++res; else aa[pre] |= aa[u]; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif while (scanf("%d%d", &n, &m) != EOF && n+m) { for (int i = 1; i<=n; ++i) ee[i].clear(), dd[i].clear(); memset(vis, 0, sizeof vis); res = 0; for (int i = 0; i< n-1; ++i) { int u,v; scanf("%d%d", &u, &v); ee[u].push_back(v); ee[v].push_back(u); } for (int i = n-1; i< m; ++i) { int u, v; scanf("%d%d", &u, &v); dd[u].push_back(v); dd[v].push_back(u); } dfs(1,-1); printf("%d\n", res); } return 0; }
本文介绍了一种使用图遍历算法解决特定问题的方法,通过DFS深度优先搜索结合bitset记录访问状态,实现对混合边类型图的有效遍历。该算法能够统计特定路径的数量,并通过实例演示了如何构建数据结构及实现过程。
384

被折叠的 条评论
为什么被折叠?



