题目描述
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友情赞助
代码
#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;
}