c++:

#include<iostream>
#include<vector>
using namespace std;
const int N=1e5;
int n,m,t=0,mi=1145141145;
struct node
{
	int d;//点值
	int go;//标记是否封锁过
};
vector<node >g[N];//邻接表
bool dfs(int x)//深度优先
{
	t++;//记1次
	for(int i=0;i<g[x].size();i++)
	{
		if(g[x][i].go==0)//没有封锁时
		{
			g[x][i].go=1;
		}
		else if(g[x][i].go==1)//封锁时
		{
			t--;
			return false;//返回
		}
	}
	for(int i=0;i<g[x].size();i++)//遍历每个点
	{
		for(int j=0;j<g[g[x][i].d].size();j++)//每个点的下个点
		{
			if(g[g[x][i].d][j].go==0)//没有封锁时
			{
				g[g[x][i].d][j].go=1;
				dfs(g[g[x][i].d][j].d);
			}
			else if(g[g[x][i].d][j].d==x)//为此点时(回路)
			{
				t--;
				return false;//返回
			}
			else if(g[g[x][i].d][j].go==1)
			{
				t--;
				return false;//返回
			}
		}
	}
	return true;
}
vector<int >p;//存储所有点
bool fi(int x)//是否有这个点
{
	for(int i=0;i<p.size();i++)
	{
		if(p[i]==x);
		{
			return true;
		}
	}
	return false;
}
int main()
{
	cin>>n>>m;//输入
	for(int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;//输入
		g[u].push_back({v,0});//添加边
		g[v].push_back({u,0});//添加边
		if(!fi(u))
		{
			p.push_back(u);//添加点
		}
		if(!fi(v))
		{
			p.push_back(v);//添加点
		}
	}
	for(int i=0;i<p.size();i++)//每个点
	{
		for(int j=0;j<p.size();j++)//重置
		{
			for(int k=0;k<g[p[j]].size();k++)
			{
				g[p[j]][k].go=0;
			}
		}
		t=0;//重置记数
		bool f=dfs(p[i]);//深度优先
		if(f && t<mi)//检测是否是最小的
		{
			mi=t;
		}
	}
	if(mi==1145141145)//没有解时
	{
		cout<<"Impossible";//输出
	}
	else
	{
		cout<<mi;//输出
	}
	return 0;//完 结(蛋) 散花
}

2 comments

  • 1

Information

ID
977
Time
1000ms
Memory
256MiB
Difficulty
8
Tags
# Submissions
41
Accepted
7
Uploaded By