dfs水过:

 /*
Name: NYOJ--42--一笔画问题
Author: shen_渊
Date: 18/04/17 15:22
Description: 这个题用并查集做,更好。在练搜索,试试手
本来用的vector存放边,结果,vector并不能当做数组,遍历的时候只能用迭代器
中间没有数据的部分读取会出错
输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。
(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。
输出
如果存在符合条件的连线,则输出"Yes",
如果不存在符合条件的连线,输出"No"。
*/
#include<bits/stdc++.h>
using namespace std;
void dfs(int);
int vis[];
int vec[][];
int outDegree[];
int N,P,Q,flag;
int main(){
int N;cin>>N;
while(N--){
flag = ;
memset(vec,,sizeof(vec));
memset(vis,,sizeof(vis));
memset(outDegree,,sizeof(outDegree));
cin>>P>>Q;
for(int i=; i<Q; ++i){
int x,y;cin>>x>>y;
vec[x][y] = vec[y][x] = ;
}
dfs();
int mark = ;
for(int i=; i<=P; ++i){
if(outDegree[i] == ){
mark = ;break;
}
if(outDegree[i]%)flag++;
}
if(mark)cout<<"No"<<endl;
else if(flag == || flag == )cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return ;
}
void dfs(int i){
vis[i] = ;
for(int k=; k<=P; ++k){
if(vec[i][k]){
outDegree[i]++;
if(!vis[k])
dfs(k);
}
}
}

学到图论了,用并查集+欧拉做一次:

 /*
欧拉路径,无向图
1判断是否为连通图,
2判断奇点的个数为0或2按照题意,只要是欧拉回路或者通路都符合题意
*/
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
int edge[];
struct DisjoinSet {
vector<int> father, rank; DisjoinSet(int n): father(n), rank(n) {
for (int i=; i<n; i++) {
father[i] = i;
}
} int easy_find(int v) {//非递归
int k, j, r;
r = v;
while (r!=father[r]) {
r = father[r];
}
k = v;
while (k!=r) {
j = father[k];
father[k] = r;
k = j;
}
return r;
}
void merge(int x, int y) {
int a = easy_find(x), b = easy_find(y);
if (rank[a] < rank[b]) {
father[a] = b;
} else {
father[b] = a;
if (rank[b] == rank[a]) {
++rank[a];
}
}
}
} ; int p, q;
int main()
{
// freopen("in.txt", "r", stdin);
int N;
scanf("%d", &N);
while (N--) {
memset(edge, , sizeof(edge));
scanf("%d %d", &p, &q);
DisjoinSet mfs();
for (int i=; i<q; i++) {
int a, b;
scanf("%d %d", &a, &b);
edge[a]++;
edge[b]++;
mfs.merge(a, b);
}
int father = mfs.easy_find();
int ct = ;
for (int i=; i<=p; i++) {
if (mfs.father[i] != father) {
ct = -;
break;
}
if (edge[i] & ) ct++;
}
if (ct == || ct == ) printf("Yes\n");
else printf("No\n");
}
return ;
}

最新文章

  1. 初识Polymer框架
  2. iOS开发 火星坐标转百度坐标
  3. .NET 分页
  4. Linux Linux程序练习六
  5. (二)重拾单片机 第一天 LED灯
  6. phalcon几种分页方法
  7. [JS]以下是JS省市联动菜单代码
  8. acdream 1738 世风日下的哗啦啦族I
  9. C++ 出现bug :二位数组的操作运算,求非对角线的元素的和
  10. python 获取对象信息
  11. vga|9针串口|网口测试方法
  12. AngularJs 4大核心
  13. cmd登录远程Oracle数据库
  14. [POJ1006]生理周期 (中国剩余定理)
  15. [转帖]召冠总的 SQLSERVER常用的性能诊断语句. --保存学习备查
  16. Java_万年历(简单)
  17. Multi-cloud Kubernetes with Triton
  18. Jmeter学习之— 参数化、关联、断言、数据库的操作
  19. Python学习笔记11:标准库之文件管理(os包,shutil包)
  20. 抽取JDBCTemplate

热门文章

  1. org.hibernate.type.SerializationException: could not deserialize 反序列化失败
  2. 我在面试.NET/C#程序员时会提出的问题(转载)
  3. tomcat6指定的服务为安装
  4. config相关操作(转)
  5. python函数的作用域
  6. IO多路复用的作用?并列举实现机制以及区别?
  7. 016-Spring Boot JDBC
  8. Windows平台下搭建Git服务器的图文教程(转发)
  9. 求阶乘,输入一个正整数 n,输出n!
  10. LeetCode:区域和检索【303】