Title Address: HDU 3018
For each point, the number of degrees is odd for each connected branch, and then the number of times required is number/2. Note that the isolated points cannot be counted.
The code is as follows:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include < algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h>using namespace std; #define LL Long long#define pi ACOs ( -1.0) const int Mod=1e9+7;const int Inf=0x3f3f3f3f;const double eqs=1e-9; const int Maxn=100000+10;int HEAD[MAXN], CNT, VIS[MAXN], DEG[MAXN], sum, ans;struct node{int i, V, next;} edge[4*maxn];void Add (int u, int v) {edge[cnt].v=v; Edge[cnt].next=head[u]; head[u]=cnt++;} void Dfs (int u) {if (deg[u]&1) sum++; for (int i=head[u];i!=-1;i=edge[i].next) {int v=edge[i].v; if (!vis[v]) {vis[v]=1; DFS (v); }}}void init () {memset (head,-1,sizeof (head)); cnt=0; memset (vis,0,sizeof (VIS)); memset (deg,0,sizeof (deg)); Ans=0;} int main () {int n, m, I, J, u, V; while (scanf ("%d%d", &n,&m)!=eof) {init (); while (m--) {scanf ("%d%d", &u,&v); if (u==v) continue; Add (U,V); Add (V,u); deg[u]++;d eg[v]++; } for (i=1;i<=n;i++) {if (!vis[i]&&[i]) {sum = 0; DFS (i); if (sum) ANS+=SUM/2; else ans+=1; }} printf ("%d\n", ans); } return 0;}
HDU 3018 Ant Trip (Euler path)