poj3018(欧拉路)

来源:互联网 发布:网络看电视软件 编辑:程序博客网 时间:2024/06/16 13:54
题意:
给出一张图;要求走过的边不能再走;
需要分几个队伍才能访问完,就是要画几笔;


思路:
算每个联通分量的奇点个数;
每两个奇点,就需要一队人访问;
所以每一个联通分量需要 奇点个数 / 2 的队伍;
如果这个联通分量奇点个数为0,也需要一队;

还有一个就是,如果是孤立点,就不需要,因为我们要访问所有的边,孤立点没有边.


#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N = 100000 + 5;vector<int> p[N];int vis[N];int n, m, num, q, u, v;int ans;void dfs(int cur) {vis[cur] = 1;if(p[cur].size() % 2)q++;for(int i = 0; i < p[cur].size(); i++) {if(!vis[p[cur][i]]) {dfs(p[cur][i]);}}}int main() {while (scanf("%d%d", &n, &m) == 2) {ans = 0;memset(vis, 0, sizeof(vis));for(int i = 0; i <= n; i++)p[i].clear();for(int i = 0; i < m; i++) {scanf("%d%d", &u, &v);p[u].push_back(v);p[v].push_back(u);}for(int i = 1; i <= n; i++) {if(!vis[i]) {if(p[i].size() == 0)continue;q = 0;dfs(i);if(q == 0)ans++;elseans += q / 2;}}printf("%d\n",ans);}}



0 0
原创粉丝点击