• zju pat1013


    #include <iostream>
    using namespace std;
    
    int road[500000][2];
    int city[1005];
    
    void init_union(int n)
    {
        int i;
        for(i = 1 ;i<=n;i++)
            city[i] = i;
    }
    
    int find(int x)
    {
        int r= x;
        while(city[r]!=r) //首先找到最顶端的root
        {
            r = city[r];
        }
        int i = x;
        int j;
        while (i!=r)  //压缩路径
        {
            j = city[i];  //依次记录路径上的点,然后分别指向root
            city[i] = r;
            i = j;
        }
    
        return r; //返回root
    }
    
    void join(int r[2]){
        int fx = find(r[0]);
        int fy = find(r[1]);
        if(fx != fy)
            city[fx] = fy;
    }
    
    int main(){
        int n,m,k;
        int i,j,flag,t;
        while(cin>>n>>m>>k){
            for(i =0;i< m;i++)
            {
                cin>>road[i][0]>>road[i][1];
            }
    
            init_union(n);
    
            for(j =0;j<k;j++)
            {
                cin>>flag;
                if(road[j][0]!=flag && road[j][1]!=flag)//去除跟被占领的边
                    join(road[j]);
                int num = 0;
                for(t=1;t<=n;t++)
                    if(city[t]==t) //有多少个圈子,因为被敌人占领那个,也是一个,所以多减了一个,
                        num++;
                cout<<num-2<<endl;
            }
        
        }
        return 0;
    }

    //bfs搜索

    #include <iostream>
    #include <string.h>
    #include <queue>
    using namespace std;
    #define N 1001
    int main()
    {
        int n,m,k,i,j,t,c1,c2;
        bool ways[N][N];
        int concern[N];
        memset(ways,false,sizeof(ways));
        memset(concern,false,sizeof(concern));
        while(cin>>n>>m>>k)
        {
            for(i =0;i<m;i++)
            {
                cin>>c1>>c2;
                ways[c1][c2] = true;
                ways[c2][c1] = true;
            }
            for(i =0; i<k;i++)
            {
                cin>>concern[i];
            }
            for(i =0;i<k;i++)
            {
                int visit[N],count;
                queue<int>q;
                memset(visit,false,sizeof(visit));
                visit[concern[i]] = true;
                count =0;
                for(j =1;j<=n;j++)
                {
                    if(visit[j]!=true)  //bfs
                    {
                        queue<int>dq;
                        visit[j] =1;
                        dq.push(j);
                        while(!dq.empty())
                        {
                            int temp = dq.front();
                            dq.pop();
                            for(t =0;t<=n;t++)  //深度搜索,看是否有相连的城市,访问过,则标记
                            {
                                if(ways[temp][t]&& visit[t]!=1)
                                {
                                    dq.push(t);
                                    visit[t] = 1;
                                }
                            }
                        } 
                        count++;  //有多少个圈,孤岛+1
                    }
                }
                cout<<count -1<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    获取系统当前时间
    使用键盘控制窗体的移动
    打开和关闭输入法编辑器
    屏蔽系统的Ctrl+c/x/v操作
    按Esc键实现关闭窗体
    屏蔽Alt+F4关闭窗体
    将回车键转换为Tab键
    node.js入门学习(六)--express
    curl POST如何查看响应的Header(转)
    node.js入门学习(五)--Demo模块化改造
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3516606.html
Copyright © 2020-2023  润新知