zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    centos6系列更换阿里yum源
    javascript字符串方法学习汇总
    ORA-01439:要更改数据类型,则要修改的列必须为空
    Python之字典
    Python之元组
    Python之列表
    Tensorflow 快速学习
    Ubuntu 切换到root 授权失败
    受限玻尔兹曼机二
    Numpy 数组ndarray和常用函数速查
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3516606.html
Copyright © 2011-2022 走看看