英雄联盟阵营

题目描述
符文之地——瓦罗兰,作为最大的一块魔法大陆,它居于符文之地心脏中心,是符文之地面积最大的大陆。所有谋求符文之地霸权的势力,都将焦点放在了瓦罗兰。 
近200年来的战争和纷争导致魔法滥用,军队用法术和符文武装自己,英雄们打造出大部分魔法物品率领部队厮杀。他们拥有近乎无限的原始魔法力量使用,从未考虑过无止境的滥用魔法会给这片大陆的环境带来怎么样的灾难。最后两次符文之战影响了瓦罗兰的地质环境。地震和魔法风暴让整个瓦罗兰为之颤抖,对人们来说这份恐惧远超过战争的恐怖。人们终于意识到世界已经承受不起符文之战的破坏。 
为了回应世界上不断恶化的政治和经济危机,瓦罗兰的大法师们达成共识,冲突以可控和系统化的方式来处理。他们成立了一个叫英雄联盟的组织。 
但联盟的纷争并没有消失,以德玛西亚和诺克萨斯等阵营的英雄们继续为他们的信念而战。 
输入
第一行有两个整数n,m。 
n(0 < n < 100)表示有n个英雄;m(0 < m < 100)表示接下来有m行数据。 
接下来m行,每行都有两个整数a,b。表示a,b英雄在同一个阵营。在默认情况下,任意两个英雄不在同一阵营。
输出
输出n个英雄的阵营的个数。
样例输入
5  3
1  2
2  3
4  5
样例输出
2

import java.util.*;
public class Main {
    static int n;
    static int m;
    static Scanner cin=new Scanner(System.in);
    public static void main(String[] args) {
        n=cin.nextInt();
        m=cin.nextInt();
        Graph G=new Graph();
        CC cc=new CC(G);
        System.out.println(cc.getCount());
        cin.close();
    }
    private static class Graph {
        static int V;
        int E;
        static LinkedList<Integer>[] adj;
        public Graph() {
            this.V=n;
            this.E=m;
            adj=new LinkedList[V+1];
            for(int v=1;v<V+1;v++){
                adj[v]=new LinkedList<>();
            }
            for(int i=0;i<E;i++){
                int v=cin.nextInt();
                int w=cin.nextInt();
                addEdge(v,w);
            }
        }
        private void addEdge(int v, int w) {
            adj[v].add(w);
            adj[w].add(v);
        }
        public Iterable<Integer> adj(int v){
            return adj[v];
        }
        public int V(){
            return V;
        }
        @Override
        public String toString() {
            String s=V+"vertices, "+E+"edges\n";
            for(int v=1;v<V+1;v++){
                s+=v+":";
                for(int w:this.adj(v)){
                    s+=w+" ";
            }
                s+="\n";
            }
            return s;
        }
    }
    private static class CC {
        private boolean []marked;
        private int []id;
        private int count;
        public CC(Graph G) {
            marked=new boolean[G.V()+1];
            id=new int[G.V()+1];
            for(int i=1;i<G.V()+1;i++){
                if(!marked[i]){
                    dfs(G,i);
                    count++;
                }
            }
        }
        private void dfs(Graph G, int i) {
            marked[i]=true;
            id[i]=count;
            for(int w:G.adj(i)){
                if(!marked[w]){
                    dfs(G,w);
                }
            }
        }
        public int getCount() {
            return count;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值