Einstein学画画
题目描述
Einstein 学起了画画。
此人比较懒~~,他希望用最少的笔画画出一张画……
给定一个无向图,包含 nnn 个顶点(编号 1∼n1 \sim n1∼n),mmm 条边,求最少用多少笔可以画出图中所有的边。
输入格式
第一行两个整数 n,mn, mn,m。
接下来 mmm 行,每行两个数 a,ba, ba,b(a≠ba \ne ba=b),表示 a,ba, ba,b 两点之间有一条边相连。
一条边不会被描述多次。
输出格式
一个数,即问题的答案。
样例 #1
样例输入 #1
5 5
2 3
2 4
2 5
3 4
4 5
样例输出 #1
1
提示
对于 50%50 \%50% 的数据,n≤50n \le 50n≤50,m≤100m \le 100m≤100。
对于 100%100\%100% 的数据,1≤n≤10001 \le n \le 10001≤n≤1000,1≤m≤1051 \le m \le {10}^51≤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;
}

文章讲述了Einstein假设学习画画时遇到的问题,即如何使用最少的笔画画出无向图的所有边。通过图论中的一笔画性质,即奇数度节点数为0或2时图可一笔画,解决此问题。给定图的节点和边数,程序检查奇数度节点数,若为0或2则答案为1,否则答案为奇数度节点数除以2。
206

被折叠的 条评论
为什么被折叠?



