L2-025 分而治之 (25 分)

该博客探讨了一种图论算法的应用,主要针对如何判断攻击计划是否能使所有城市孤立。博主通过分析题目与L2-013红色警报题目的相似性,指出并查集在这类问题中并非必需。核心思路是对输入的边进行记录,并在处理每个询问时,检查攻击计划中的城市是否覆盖了所有边。如果存在未被攻击的城市间的边,则该计划无法使所有城市孤立,输出"NO";否则,输出"YES"。博客提供了详细的代码实现过程。
摘要由CSDN通过智能技术生成

思路:

这题和L2-013红色警报那题很像,那题是用并查集做的,所以这题一开始我也用的并查集,但是过了之后发现用并查集多此一举了。是因为这题不用统计孤立点的个数,只要判断是不是全孤立就好了,所以用不到并查集。

大致思路就是把输入给出的边记录下来,我们之后处理每次询问都要用。处理询问时,给攻打的城市做上标记,然后再遍历我们记录下来的边,只要有一对边A-B,其中A、B都没有在攻打计划中,那么这个方案就不可行,必须所有边都至少有一个城市在攻打计划中。因为如果两个联通的城市都不在攻打计划中,那么这俩城市还是联通的,就不能让所有城市孤立了。

代码:

#include<iostream>
#include<cstdio>
using namespace std;

int date[10010][2];
int n,m,a,b,k,np;
bool book[10010];

int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>date[i][0]>>date[i][1];
    cin>>k;
    while(k--){
        cin>>np;
        int temp;
        for(int i=1;i<=np;i++){
            cin>>temp;
            book[temp]=true;
        }
        int st=true;
        for(int i=1;i<=m;i++){
            a=date[i][0],b=date[i][1];
            if(!book[a]&&!book[b]) st=false;
        }
        if(st) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        for(int i=1;i<=n;i++) book[i]=false;
    }
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值