1093D. Beautiful Graph - Codeforces Solution C++

  Problem Link : 1093D. Beautiful Graph 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;

#define ll long long int
ll m = 998244353;

vector<int> adj[300001];
bool visited[300001];
bool visited2[300001];
int color[300001];
int color2[300001];
ll dfs(int v,int n,int p,int oe)
{
	ll ans=1;
	color[v]=oe;
	if(oe==1)
	{
		for(int i=0;i<adj[v].size();i++)
		{
			if(adj[v][i]==p)
				continue;
			if(!visited[adj[v][i]])
			{
				visited[adj[v][i]]=1;
				ans=(ans*dfs(adj[v][i],n,v,2))%m;
			}
			else
			{
				if(color[adj[v][i]]==1)
				{
					return 0;
				}
			}

		}
     //   cout<<ans<<endl;
		ans=(ans*2)%m;
		return ans;
	}
	else
	{
		for(int i=0;i<adj[v].size();i++)
		{
			if(adj[v][i]==p)
				continue;
			if(!visited[adj[v][i]])
			{
				visited[adj[v][i]]=1;
				ans=(ans*dfs(adj[v][i],n,v,1))%m;
			}
			else
			{
				if(color[adj[v][i]]==2)
				{
					return 0;
				}
			}

		}
	//	cout<<ans<<endl;
		return ans%m;
	}
}


ll dfs2(int v,int n,int p,int oe)
{
	ll ans=1;
	color2[v]=oe;
	if(oe==1)
	{
		for(int i=0;i<adj[v].size();i++)
		{
			if(adj[v][i]==p)
				continue;
			if(!visited2[adj[v][i]])
			{
				visited2[adj[v][i]]=1;
				ans=(ans*dfs2(adj[v][i],n,v,2))%m;
			}
			else
			{
				if(color2[adj[v][i]]==1)
				{
					return 0;
				}
			}

		}
     //   cout<<ans<<endl;
		ans=(ans*2)%m;
		return ans;
	}
	else
	{
		for(int i=0;i<adj[v].size();i++)
		{
			if(adj[v][i]==p)
				continue;
			if(!visited2[adj[v][i]])
			{
				visited2[adj[v][i]]=1;
				ans=(ans*dfs2(adj[v][i],n,v,1))%m;
			}
			else
			{
				if(color2[adj[v][i]]==2)
				{
					return 0;
				}
			}

		}
	//	cout<<ans<<endl;
		return ans%m;
	}
}




int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,e,u,v;
		cin>>n>>e;
		bool flag=0;
		for(int i=0;i<=n;i++)
		{
			adj[i].clear();
			visited[i]=0;
			visited2[i]=0;
			color[i]=0;
			color2[i]=0;
		}
			
		for(int i=0;i<e;i++)
		{
			cin>>u>>v;
			adj[u].push_back(v);
			adj[v].push_back(u);
		}

		ll cnt=1;
		
		for(int i=1;i<=n;i++)
		{
		    ll tmp=-1,tmp2=-1;
		    if(!visited[i])
		    {
		       	visited[i]=1;
		        tmp=dfs(i,n,-1,1)%m;
		        if(!tmp)
		        {
		            flag=1;
		            break;
		        }
		    }
		    if(!visited2[i])
		    {
		        visited2[i]=1;
		        tmp2=dfs2(i,n,-1,2)%m;
		        if(!tmp2)
		        {
		            flag=1;
		            break;
		        }
		        tmp=(tmp2 + tmp)%m;
		    }
		    if(tmp>0)
		        cnt=(cnt*tmp)%m;
		    
		}
        if(flag)
           cout<<"0\n"; 
		else
		    cout<<cnt<<"\n";
	}
}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!