7-12 红色警报
核心的思路就是用联通块的数量变多,来判断这个城市是不是核心城市,但是注意这一题,需要更新删除后的联通块的数量。
经典的dfs来计算联通块数量
#include <bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using psc=pair<string,char>;
map<string,int>mp;
vector<int>city[1005];
bool del[1005];
bool vis[1005];
void dfs(int x)//dfs来标记
{
for(auto i:city[x])
{
if(!vis[i]&&!del[i])
{
vis[i]=1;
dfs(i);
}
}
}
void solve()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v;
city[u].push_back(v);
city[v].push_back(u);
}
int sum=0;
//检查连通块的数量
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=1;
sum++;
dfs(i);
}
}
int flag=0;
//如果删除掉一个城市其连通块的数量变多则说明其是核心城市
int q;cin>>q;
//但是这题有点奇怪,需要判断的是,删除完这个城市后,这就是一个新的图
//你需要用删除完上次这个城市的连通块数量 和删除当前这个城市后的联通块数量进行比较
//而不是拿刚开始的地图的联通块来一直比较下去
for(int i=0;i<q;i++)
{
int id;
cin>>id;
int tmp=0;
memset(vis,0,sizeof vis);
del[id]=1;//删除对应城市
for(int j=0;j<n;j++)
{
if(!vis[j]&&!del[j]){//没走过且不是被删除的城市才遍历
vis[j]=1;
tmp++;
dfs(j);
}
}
if(tmp>sum){
cout<<"Red Alert: City "<<id<<" is lost!\n";
}else{
cout<<"City "<<id<<" is lost.\n";
}
sum=tmp;//这一步很关键,更新联通块数量
if(i==n-1) cout<<"Game Over.";
}
}
signed main()
{
int t=1;
ios::sync_with_stdio(0),cin.tie(0);
// cin>>t;
while(t--) solve();
return 0;
}
posted on 2025-03-23 13:43 swj2529411658 阅读(12) 评论(0) 收藏 举报
浙公网安备 33010602011771号