hdu 4582 DFS spanning tree

来源:互联网 发布:新郎 婚礼开场白 知乎 编辑:程序博客网 时间:2024/06/10 06:51


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

#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);#endifwhile (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;}


0 0
原创粉丝点击