绳子切割 图论

题目描述

Nanarikom 正在切割绳子。

Nanarikom 有一根横梁(使用编号 0 表示)和 n 个苹果(使用编号 1 到 n 表示),并且使用 m 根绳子将它们连接,每根绳子的两端分别连接一个编号在 [0,n] 内的物品。

如果一个苹果可以经过若干绳子与横梁直接或间接连接,则这个苹果处于悬挂状态。初始状态下,所有苹果都处于悬挂状态。Nanarikom 可以按任意顺序依次切割绳子,被切割的绳子将不再构成连接。如果某一次切割操作后,编号为 i 的苹果不再处于悬挂状态,则这个苹果会落在地上。

Nanarikom 想要知道,是否存在一种切割绳子的顺序,使得苹果落地的编号顺序单调递减,且不存在某一时刻有多于一个苹果同时落地。

你需要回答 Nanarikom 的 T 组询问。

输入

第一行包含一个整数 T(1≤T≤104),代表测试数据组数。对于每组测试数据:

第一行包含两个整数 n, m(1≤n≤105,n≤m≤min⁡(105,n(n+1)/2),分别代表苹果和绳子的数量;

接下来的 m 行中,第 i 行包含两个整数 ui , vi(0≤ui,vi≤n, ui≠vi),代表第 i 根绳子连接 ui 和 vi。

输入数据保证,至多只有 20 组测试数据使得 m>100。

输入数据保证,初始状态下,所有苹果都处于悬挂状态。

输出

对于每组测试数据,输出一行一个整数,如果存在可行方案,输出 1;否则输出 0。

样例输入

复制

复制代码
2
2 2
0 1
1 2
3 4
0 3
0 2
3 1
2 1
样例输出

复制

复制代码
1
0

给绳子赋方向

大苹果指向小苹果

统计每个苹果的出度,=0说明不可以

感谢JZ友情赞助

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
	int n,m,u,v;
	scanf("%d%d",&n,&m);
	vector<int>c(n+1,0);
	while(m--){
		scanf("%d%d",&u,&v);
		if(u>v)c[u]++;
		else c[v]++;
	}
	for(int i=1;i<=n;++i){
		if(!c[i]){
			cout<<"0\n";return;
		}
	}
	cout<<"1\n";
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		//cout<<"ans:";
		solve();
	}
	return 0;
}
相关推荐
Maỿbe4 小时前
力扣hot图论部分
算法·leetcode·图论
Bruce_kaizy4 小时前
c++图论————图的基本与遍历
c++·算法·图论
_OP_CHEN4 小时前
【算法基础篇】(三十五)图论基础之最小生成树:从原理到实战,彻底吃透 Prim 与 Kruskal 算法
算法·蓝桥杯·图论·最小生成树·kruskal算法·prim算法·acm/icpc
浔川python社8 小时前
C++小程序编写系列(2)
c++·算法·图论
qq_418247881 天前
恒源云/autodl与pycharm远程连接
ide·人工智能·python·神经网络·机器学习·pycharm·图论
m0_639397291 天前
代码随想录算法训练营第五十天|图论理论基础,深搜理论基础,98. 所有可达路径,广搜理论基础
算法·图论
做怪小疯子2 天前
LeetCode 热题 100——图论——岛屿数量&腐烂的橘子&课程表
算法·leetcode·图论
_OP_CHEN2 天前
【算法基础篇】(三十四)图论基础深度解析:从概念到代码,玩转图的存储与遍历
算法·蓝桥杯·图论·dfs·bfs·算法竞赛·acm/icpc
@我漫长的孤独流浪3 天前
程序综合实践第十二周-二叉树
算法·深度优先·图论
我不会写代码njdjnssj3 天前
图论问题-最短路径
数据结构·算法·图论