做这题又看到大神的博客们都在说水题、简单题。
果然,DFS的运用极其不娴熟,于是又是一点点抄下来了。
把别人的代码理解一遍,总好过跳过吧,加了一点注释。希望和我一样的朋友们可以多少获得一点帮助。
PS:题目要的是占用所有边的点至少要有几个。
代码:#include <iostream> #include <string> #include <vector> using namespace std; const int N = 1510; vector<int> mp[N];//存储点到点 int n, linker[N], vis[N]; //linker[N]存储边占用情况 int DFS(int u){ int v; for (v = 0; v < (int)mp[u].size(); v++){ if (!vis[mp[u][v]]){ vis[mp[u][v]] = 1; if (linker[mp[u][v]] == -1 || DFS(linker[mp[u][v]]))//搜索到边未被使用的或是从v可以再找到未占用边 { linker[mp[u][v]] = u; //边已被占用 return 1; } } } return 0; } int Hungry(){ int u, ans = 0; memset(linker, -1, sizeof(linker)); for (u = 0; u < n; u++){ memset(vis, 0, sizeof(vis)); if (DFS(u)){ ans++; } } return ans; } int main() { while (cin >> n){ int u, v, k; for (int i = 0; i < n; i++) mp[i].clear(); for (int i = 0; i < n; i++){ scanf("%d:(%d)", &u, &k); while (k--){ scanf("%d", &v); mp[u].push_back(v); mp[v].push_back(u); } } cout << Hungry() / 2 << endl; //贪心,输出为结果1/2因为要把所有边占据而一条边对应两个结点 } return 0; }
HDOJ 1054 Strategic Game(DFS + 容器)
最新推荐文章于 2019-11-30 09:09:06 发布