zoukankan      html  css  js  c++  java
  • 1013 Battle Over Cities (25 分)(图的遍历or并查集)

    这题用并查集或者dfs都可以做

    dfs

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N=1e3+10;
    bool mp[N][N];
    int n,m,k;
    bool vis[N];
    void dfs(int v)
    {
        vis[v]=true;
        for(int i=1;i<=n;i++){
            if(mp[v][i]&&!vis[i]){
                dfs(i);
            }
        }
    }
    int main()
    {
        fill(mp[0],mp[0]+N*N,false);
        scanf("%d %d %d",&n,&m,&k);
        for(int i=0;i<m;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            mp[a][b]=mp[b][a]=true;
        }
        while(k--){
            fill(vis,vis+N,false);
            int x;
            scanf("%d",&x);
            vis[x]=true;
            int sum=0;
            for(int i=1;i<=n;i++){
    
                if(!vis[i]){
                    sum++;
                    dfs(i);
                }
            }
            printf("%d
    ",sum-1);
        }
        return 0;
    }

    并查集

    #include<bits/stdc++.h>
    
    using namespace std;
    
    vector<pair<int,int> > edge;
    int f[1005];
    int n,m;
    int findth(int x)
    {
        if(x==f[x]) return x;
        return f[x]=findth(f[x]);
    }
    void join(int x,int y)
    {
        int fx,fy;
        fx = findth(x);
        fy = findth(y);
        if (fx != fy)
            f[fx] = fy;
    }
    void solve(int p)
    {
        for (int i = 1 ; i <= n ; i++) f[i] = i;
        for (int i = 0 ; i < edge.size() ; i++){
            if (edge[i].first == p || edge[i].second == p) continue;
            join(edge[i].first,edge[i].second);
        }
        int cnt = 0;
        for (int i = 1 ; i <= n ; i++){
            if (i == p)
                continue;
            if(f[i]==i) cnt++;
        }
        printf("%d
    ",cnt-1);
    }
    int main()
    {
        int k;
        scanf("%d %d %d",&n,&m,&k);
        edge.resize(m);
        for (int i = 0 ; i < m ; i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            edge[i] = make_pair(x,y);
        }
        for (int i = 1 ; i <= k ; i++)
        {
            int q;
            scanf("%d",&q);
            solve(q);
        }
        return 0;
    }
  • 相关阅读:
    垂直的SeekBar:VerticalSeekBar
    android 获取路径目录方法以及判断目录是否存在,创建目录
    JSON
    列表和导航
    【前端积累】链接
    【前端积累】背景图像和背景替换
    【前段积累】可视化模型
    【前端积累】选择器
    银联支付-产品测试sdk使用流程
    【CSS系列】块级元素和行内元素
  • 原文地址:https://www.cnblogs.com/chenchen-12/p/10105131.html
Copyright © 2011-2022 走看看