[CCCC]7-39 红色警报 (25 分)- DFS

7-39.png

分析

考察dfs,不过这道题有个大坑点。。。因为一次警报要遍历两次图,通过前后的对比才能得知是否是红色警报。。。应该要做两次清零
用二维数组做的时候能通过全部测试点,但是用向量数组做的时候有几个点就是过不了,不知道是哪里的问题,至今未解决。。。

ac代码

#include<iostream>
using namespace std;

int N,M;
int map[505][505]={0};
int book[505]={0};
int gongzhan[505]={0};

void dfs(int city){
    book[city]=1;
    for(int i=0;i<N;i++){
        if(!book[i] && map[city][i]==1 && !gongzhan[city]){
            book[i]=1;
            dfs(i);
        }
    }
}

int num(){
    int count=0;
    for(int i=0;i<N;i++){
        if(book[i]==0 && gongzhan[i]==0){
            dfs(i);
            count++;
        }
    }
    return count;
}

int main(){
    cin>>N>>M;
    for(int i=0;i<M;i++){
        int a,b;
        cin>>a>>b;
        map[a][b]=map[b][a]=1;
    }
    int K;
    cin>>K;
    for(int i=0;i<K;i++){
        int city;
        cin>>city;
        
        for(int i=0;i<N;i++){
            book[i]=0;
        }
        int pre=num();
        
        gongzhan[city]=1;
        
        for(int i=0;i<N;i++){
            book[i]=0;
        }
        int after=num();
        if(after>pre){
            printf("Red Alert: City %d is lost!\n",city);
        }else{
            printf("City %d is lost.\n",city);
        }
        
        //game over结束标志
        int flag=0;
        for(int j=0;j<N;j++){
            if(gongzhan[j]==0){
                flag=1;
            }
        }
        if(flag==0){
            cout<<"Game Over."<<endl;
            break;
        }
    }
}

向量数组做法(没能ac)

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> mp[500];
int visit[500];
int gongzhan[500];


void dfs(int i){
    visit[i]==1;
    for(int j=0;j<mp[i].size();j++){
        if(gongzhan[mp[i][j]]==0 && visit[mp[i][j]]==0 ){
            visit[mp[i][j]]=1;
            dfs(mp[i][j]);
        }
    }
}

int num(){
    int number=0;
    for(int i=0;i<n;i++){
        if(gongzhan[i]==0 && visit[i]==0){
            dfs(i);
            number++;
        }
    }
    return number;
}


int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        mp[a].push_back(b);
        mp[b].push_back(a);
    }
    /*
    for(int i=0;i<n;i++){
        for(int j=0;j<mp[i].size();j++){
            cout<<mp[i][j]<<" ";
        }
        cout<<endl;
    }
    */
    
    int k;
    cin>>k;
    for(int i=0;i<k;i++){
        int city;
        cin>>city;
        
        for(int j=0;j<n;j++){
            visit[j]=0;
        }
        int pre=num();
        
        gongzhan[city]=1;
        
        for(int j=0;j<n;j++){
            visit[j]=0;
        }
        int last=num();
        
        if(last>pre){
            printf("Red Alert:City %d is lost.\n",city);
        }else{
            printf("City %d is lost.\n",city);
        }
        
        int flag=0;
        for(int j=0;j<n;j++){
            if(gongzhan[j]==0){
                flag=1;
            }
        }
        if(flag==0){
            cout<<"Game Over."<<endl;
        }
        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容