题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3018
3 3 1 2 2 3 1 3 4 2 1 2 3 4
1 2HintNew ~~~ Notice: if there are no road connecting one town ,tony may forget about the town. In sample 1,tony and his friends just form one group,they can start at either town 1,2,or 3. In sample 2,tony and his friends must form two group.
题目意思:
给一幅无向图,求要用多少次一笔画,把所有边走完,边只能走一次。孤立点不算。
解题思路:
dfs把每个连通块找到,然后统计奇数度数节点个数。
注意孤立节点不算。
代码:
//#include<CSpreadSheet.h> #include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<ctime> #include<bitset> #include<cmath> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) #define ll __int64 #define LL long long #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 #define M 1000000007 //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define Maxn 110000 int de[Maxn],n,m; vector<vector<int> >myv; int in[Maxn],cnt; bool vis[Maxn]; void dfs(int cur) { in[++cnt]=cur; vis[cur]=true; for(int i=0;i<myv[cur].size();i++) { int ne=myv[cur][i]; if(vis[ne]) continue; dfs(ne); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%d%d",&n,&m)) { myv.clear(); myv.resize(n+10); memset(de,0,sizeof(de)); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); myv[a].push_back(b); myv[b].push_back(a); de[a]++; de[b]++; } memset(vis,false,sizeof(vis)); int ans=0; for(int i=1;i<=n;i++) { if(!vis[i]) { cnt=0; dfs(i); int temp=0; if(cnt==1) //孤立节点不算 continue; for(int j=1;j<=cnt;j++) { if(de[in[j]]&1) temp++; //printf("i:%d j") } if(!temp) ans++; else ans+=temp/2; } } printf("%d\n",ans); } return 0; }