045月

日博 – zhui_xiuge的博客

日博

时期限度局限:3000 ms  |  内存限度局限:65535 KB

异议:4

塑造

ZYC一小儿就享受玩有些人小游戏。,它包罗中风的相片。,他想使满意给他写一个人起作用。,判别图打算排好队伍笔画。

规则,缠住使渐进不料涂漆一次,不克不及重画。

输入

第参加社交聚会仅仅一个人无符号整数n(n)。<=10)表现结帐履历的组数。
每组结帐履历的第参加社交聚会有两个无符号整数P,Q(P<=1000,Q<=2000),分别表现这个画中有多少个顶峰和多少条连线。(点的编号从1到P)
随后的Q线,每行有两个无符号整数A,B(0

输入

设想有一契合请求允许的线,那时的输入是,
设想缺席状态衔接,输入”No”。

样例输入

2

4 3

1 2

1 3

1 4

4 5

1 2

2 3

1 3

1 4

3 4

样例输入

No

Yes

本文议论图连通 欧拉的素养。

判别连通图、DFS BFS 和扩展三种方式

DFS:

时期复杂性:O(n e),因遍历一个人图,在图中至多要求每个顶峰的一个人DFS,因一旦一个人顶峰被)技术援助委为被探望,缺席更多的搜索。还运用濒表构成。,查找濒集散点时期为O(e),因而乐章结尾部是O(n e),下面的行为准则不会的切断已探望的使混合包装材料,因而它事实上是O(n 2e)

#include 
#include 
#include 

using namespace std;
const int MAXN = 100000; 
vector g[MAXN];
bool vis[MAXN];

void 国际标准化组织 包装材料)
	int i;
Vis [包装材料] = true;
	for( i = 0 ; i < g[node].size() ; i ++ ){
		if(!vis[g[node][i]])
			dfs(g[node][i]);
	}
}

bool Judge(int node_num){
	int i;
	for( i = 1 ; i <= node_num ; i ++ )
		if(!vis[i])
			return false;
	return true;
}

int main(){
	int node_num,edge_num,node1,node2,i;
//	cout << boolalpha << vis[20] << endl; 输入false,否则默认用0代替 
	while(cin >> node_num >> edge_num){ 接纳多组履历 
		for( i = 1 ; i <= node_num ; i ++ )
			g[i].clear(); //切断vector中缠住元素
		memset(vis,false,sizeof(vis));
		for( i = 0 ; i < edge_num ; i ++ ){
			scanf("%d%d",&node1,&node2);
			g[node1].push_back(node2); //将无向图当作有向图处理,正反两次接入衔接表 
			g[node2].push_back(node1); //添加到末尾 
		}
		dfs(1);
		if(Judge(node_num))
			cout << "YES" << endl;
		else cout << "NO" << endl;	
	}
	return 0;
}

BFS:

每个顶峰至多排队。,遍历图的处理事实上是找寻濒的处理。,因而它和DFS公正地,差额之处分娩顶峰探望的次差额。

用下面的BFS交换下面的DFS,这是完好无损的BFS增长

void BFS(INT) 包装材料)
	int x,i;
	queue q;
(包装材料)
	while(!()){
		x = (); 归来队列的第一个人元素
VIS[X] = true;
		() ; 切断群的第一个人元素
		for( i = 0 ; i < g[x].size() ; i ++ ) {
			if(vis[g[x][i]])
				g[x].erase(g[x].begin() + i); //切断图中已经遍历的点,提高遍历速度 
			else (g[x][i]);
		}
	}
}

结帐样例

6 6

6 1

3 4

2 3

1 2

5 6

5 3

—-连通

4 3

1 2

1 3

1 4

—-连通

使用并诊察集中判别图的连通时期,方式如次:

设定初值时(整个为1),每个包装材料被款待一个人集中。,

I.给每个边一组两组(非正式用语[i]=j)。详尽地遍历缠住点,

有一些集中(范围父包装材料假设为-1)HA,设想仅仅一个人扮演角色衔接

二。当EAC时,决定两个包装材料的根包装材料假设平稳的。,同时兼并,同时运用计数计数,表现新边,设想详尽地计数>n-1(n是顶峰数) ,图形连通性(行为准则在方式II中运用)

那时的混合Eulerian素养(剩余的个顶峰的数字)

#include 
#include 

int Find_Father(int num,int 非正式用语) 找到num的连通身分,含途径紧缩 
	return 非正式用语[真实的] == -1 ? num : Find_Father(非正式用语[真实的],非正式用语)
}

int main(){
	int N,P,Q,A,B,count;
	int 线索〔1001〕,非正式用语〔1001〕
SCANF(%D),&N);
当(n) --){
		scanf("%d%d",&P,&Q);
		memset(indegree,0,sizeof(indegree));
		memset(father,-1,sizeof(father));
		count = 0;
而(q) --){
			scanf("%d%d",&A,&B);
线索[ A] ++;
线索[B] ++;
			A = Find_Father(A,非正式用语)
			B = Find_Father(B,非正式用语)
			if( A != B){
非正式用语[阿] = B; 具有侧衔接的差额衔接角色 
				count ++; //新增边 
			}
		}
设想(计数) < P - 1){
			printf("No\n");
			continue; //跳过一次while循环 
		}
		count = 0; //当图为连通时,count用于计奇度数顶峰数字 
		while(P){
			if(indegree[P] % 2)
				count ++;
	设想(计数) > 2)
			 	break;
			P --;
		}
设想(计数) == 0 || count == 2)
			printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

参考资料:

发表评论

电子邮件地址不会被公开。 必填项已用*标注