一开始在有没有横向边的问题上纠结,后来又卡在数据结构的表示上。。。真心菜的不能看,只好从思路到数据结构都借鉴别人的吧
#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; }