[ABC287C] Path Graph?

[ABC287C] Path Graph?

题目大意:给你一张无向图,问你是不是链。

显然,如果一个图是链,必然满足有两个点(端点)度数为 11,其他点度数为 22

但是这样上去是有问题的。

因为这个图不一定连通。

所以我们考虑先判断联通,在考虑是不是链。

做法是,我们就随便找一个点,往两边去遍历,如果能遍历到全部点,那就是连通的。

复杂度为 O(n)O(n),爆锤并查集做法。

#include<bits/stdc++.h>
    using namespace std;
    const int N =1e6+10;
    int total[N],vis[N];
    vector<int> g[N<<1];
    int p;
    void dfs(int u)
    {
    	for(int i=0;i<g[u].size();i++)
    	{
    		int v=g[u][i];
    		if(vis[v]==1)
    			continue;
    		p++;
    		vis[v]=true;
    		dfs(v);
    	}
    }
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	for(int i=1,u,v;i<=m;i++)
    		cin>>u>>v,g[u].push_back(v),g[v].push_back(u),total[u]++,total[v]++;
    	dfs(1);
    	if(p!=n)
    		cout<<"No"<<endl,exit(0);
    	int sum=0,ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(total[i]==1)
    			sum++;
    		if(total[i]==2)
    			ans++;
    	}
    	if(sum==2&&ans==n-2)
    		cout<<"Yes"<<endl;
    	else
    		cout<<"No"<<endl;
    }
posted @ 2023-02-05 14:11  June_Failure  阅读(13)  评论(0)    收藏  举报  来源