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;
    }
  • 相关阅读:
    C#学习之Enum
    Ten MustHave Tools Every Developer Should Download Now
    C#学习之Random
    C#学习之Exception
    WCF Data Contract之KnownType
    ESQL应该注意的地方
    Windows 安全认证是如何进行的?
    十个必备的.NET开发小工具
    c#中判断一个process是32bit还是64bit
    怎么用python和javascript把多张png拼成一个gif
  • 原文地址:https://www.cnblogs.com/chenchen-12/p/10105131.html
Copyright © 2011-2022 走看看