UVA 10968 - KuPellaKeS(BFS)

来源:互联网 发布:凡茜卸妆油怎么样知乎 编辑:程序博客网 时间:2024/06/05 14:38

UVA 10968 - KuPellaKeS

题目链接

题意:给定一个图,要求把这个图删掉一些边后,使得他所以有点度数为不等于0的偶数,保证图一开始最多只有最多2个奇数度数结点

思路:对于有奇数点的情况,肯定从奇数点找到到另一个奇数点,途中不能路过度数为2的点,把这些边删掉就是答案,这样就相当于求最小距离,然后注意特殊情况,就是奇数点度数为1和一开始就有度数为0的情况

代码:

#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;const int N = 1005;int n, m, du[N], vis[N];vector<int> g[N];void init() {memset(du, 0, sizeof(du));for (int i = 1; i <= n; i++)g[i].clear();int u, v;while (m--) {scanf("%d%d", &u, &v);du[u]++; du[v]++;g[u].push_back(v);g[v].push_back(u);}}bool solve() {int st[2], sn = 0;for (int i = 1; i <= n; i++) {if (du[i] == 1 || du[i] == 0) return false;if (du[i] % 2)st[sn++] = i;}if (sn == 0) {printf("0\n");return true;}memset(vis, -1, sizeof(vis));queue<int> Q;Q.push(st[0]);vis[st[0]] = 0;while (!Q.empty()) {int u = Q.front();if (u == st[1]) {printf("%d\n", vis[u]);return true;}Q.pop();for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (du[v] == 2) continue;if (vis[v] != -1) continue;vis[v] = vis[u] + 1;Q.push(v);}}return false;}int main() {while (~scanf("%d%d", &n, &m) && n) {init();if (!solve()) printf("Poor Koorosh\n");}return 0;}


0 0
原创粉丝点击