- 封锁阳光大学
老湿们,打老们,帮我看一看,究竟哪里错了
- 2024-1-18 20:00:12 @
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
-
C23liupeilin LV 10 @ 2024-1-21 12:00:22
mi==1145141145爆int
-
2024-1-18 20:01:38@
帮我看看吧
- 1
Information
- ID
- 977
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 41
- Accepted
- 7
- Uploaded By