那是一棵树吗?WA90分HELP!!!🤔向各位大佬求助

题目描述

树是一种常见的数据结构.

一棵树的根节点只有一个,并且没有其他点指向它.从根节点遍历有向边,我们只会得到唯一的一个序列.

例如,下图中前两个例子是树,第三个不是:

image.pngimage.pngimage.png

给你�t张有向图,请你判断每张图是否是一颗树.

输入格式

第一行包含一个正整数�(1≤�≤2000)t(1≤t≤2000),表示测试数据组数

对于每个测试数据,第一行包含两个整数�n和�m (2≤�≤200000;1≤�≤200000(2≤n≤200000;1≤m≤200000,表示图的点数和边数.

接下来�m行每行包含两个整数�u和�v (1≤�,�≤�,�≠�)(1≤u,v≤n,u=v),代表一条�u指向�v的边.

数据保证没有重边和自环.

对于所有测试数据,数据总量不超过2∗1052∗105.

输出格式

对于每个测试数据,输出"Case k is a tree.“如果第�k个测试数据是一棵树,否则输出"Case k is not a tree.”

样例#1

样例输入#1

3
6 5
5 6
4 2
4 1
5 3
4 5
9 8
8 1
7 3
6 2
8 9
7 5
7 4
7 8
7 6
6 6
2 6
5 6
5 3
4 2
4 5
4 1

样例输出#1

Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.

我的代码

#include<bits/stdc++.h>
using namespace std;
int sum=1;
void solve(){
	int n,m,d[200005]={0};
	cin>>n>>m;
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		d[y]++;
	}
	sort(d+1,d+n+1);
	cout<<"Case "<<sum<<" is ";
	if(d[n]>1 || n-m!=1){
		cout<<"not ";
	}
	cout<<"a tree."<<endl;
	sum++;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}
2 个赞

有人吗

2 个赞

怎么啦

2 个赞

(帖子已被作者删除)

1 个赞

你在干嘛嗨嗨呦

1 个赞

dfs 呢?

1 个赞
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,t,cnt=0,sum=0;
int vis[200010],b[200010];
vector<int> a[200010];
//char a[1010][1010];
void dfs(int x){
	vis[x]=1;//标记这个点
	sum++;//点数
	int len=a[x].size();
	for(int i=0;i<len;i++){
		if(vis[a[x][i]]==0) dfs(a[x][i]);//不回走
	}
}
int main(){
	cin>>t;
	for(int num=1;num<=t;num++){//t组数据
		memset(vis,0,sizeof vis);//初始化
		cnt=ans=0;
		cin>>n>>m;
		for(int i=1;i<=n;i++){//清空树
			a[i].clear();
		}
		for(int i=1;i<=m;i++){
			int x,y;
			cin>>x>>y;
			a[x].push_back(y); //有向树存储
		}
		if(n!=(m+1)){
			printf("Case %d is not a tree.\n",num);//因为树的点数一定比边数多1,所以可以特判。
			continue;
		}
		for(int i=1;i<=n;i++){
			memset(vis,0,sizeof vis);
			sum=0;
			dfs(i);//遍历每个点,找到根结点。
			if(sum==n){//如果当前点可以遍历到所有点,说明是根结点,那就可以判断为一棵树。
				printf("Case %d is a tree.\n",num);
				ans=1;
				break;
			}
		}
		if(ans==0) printf("Case %d is not a tree.\n",num);//没有根结点就不是树了
	}
}
1 个赞

(代码作为参考)思路:只要找到根节点就可以判断它是树了。
根节点:从这个点出发可以到达所有点

代码实现:

dfs(){
    标记
    记录点数
    if(下一个点可以走)dfs(下一个点)
}

可以的话给个解决方案

1 个赞

在输入一个DAG时统计每个节点的入度,递增边数,输入结束后先判断边数是否==节点数-1,如果不是,那就不是一棵树,如果是,再枚举每一个节点,如果有两个及以上的节点入度为0,那就不是一棵树,如果有且仅有一个,那就是一棵树
理论上能行
时间复杂度为 O(V)V 为节点个数

2 个赞

其实不用,只要这个图是个连通图,如果仅一个点的入度为0,它就是root

2 个赞