Einstein学画画
题目描述
Einstein 学起了画画。
此人比较懒~~,他希望用最少的笔画画出一张画……
给定一个无向图,包含 n n n 个顶点(编号 1 ∼ n 1 \sim n 1∼n), m m m 条边,求最少用多少笔可以画出图中所有的边。
输入格式
第一行两个整数 n , m n, m n,m。
接下来 m m m 行,每行两个数 a , b a, b a,b( a ≠ b a \ne b a=b),表示 a , b a, b a,b 两点之间有一条边相连。
一条边不会被描述多次。
输出格式
一个数,即问题的答案。
样例 #1
样例输入 #1
5 5
2 3
2 4
2 5
3 4
4 5
样例输出 #1
1
提示
对于 50 % 50 \% 50% 的数据, n ≤ 50 n \le 50 n≤50, m ≤ 100 m \le 100 m≤100。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000, 1 ≤ m ≤ 10 5 1 \le m \le {10}^5 1≤m≤105。
思路: 百度了一下一笔画的性质之后,我找到了这样一句话:
一个图中的奇数点如果为0或2则这个图可以被一笔画,否则这个图可以被奇数点个数 / 2 笔画出。
奇数点:从该点引出的线的数目为奇数
于是这道题很轻松就被解决了。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, m, sum = 0;
vector<int> vec[1005];
int main(){
cin >> n >> m;
for(int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
for(int i = 1; i <= n; i++){
if(vec[i].size() % 2) sum++;
}
if(sum == 0 || sum == 2) cout << 1;
else cout << sum / 2;
return 0;
}