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)    收藏  举报

导航