问题 C: 世界那么大,我想去看看

题目描述

河南省实验中学的一名教师T的一封辞职信引发热评,辞职的理由仅有10个字:“世界那么大,我想去看看”。网友评这是“史上最具情怀的辞职信,没有之一”。经采访得知,作者为2004年7月入职河南省实验中学的一名女心理教师,已经任职11年之久。如此任性的辞职信,领导最后还真批准了。 


现在假设世界上有n个城市(用1~n标识 ),有m个高铁线路ei 格式为 xi yi ;   T的开始城市 f, 结束城市 e,她希望把所有的道路 都不重复的访问一遍,如果可以做到就输出YES 否则输出 NO

输入

城市数n和铁路m  
开始城市 f 和目的城市e 
每条铁路的起止城市 xi  yi   

输出

如果可以从开始城市 f,结束城市 e ,并把所有路径都不重复的访问一遍,就输出YES 否则输出NO

样例输入

3 2
1 3
1 2
2 3

样例输出

YES

提示

路线没有方向性,但是两个城市之间可能有多个线路 数据保证图一定是联通的

import java.util.*;
public class Main {
    static int n;
    static int m;
    static Set<Integer> set1;
    static Scanner cin=new Scanner(System.in);
    public static void main(String[] args) {
        n=cin.nextInt();
        m=cin.nextInt();
        int f=cin.nextInt();
        int e=cin.nextInt();
        Graph G=new Graph();
        List<Integer> list1=new LinkedList<>();
        List<Integer> list2=new LinkedList<>();
        Paths search=new Paths(G,f);
        if (search.hasPathTo(e)) {
            for (int x : search.pathTo(e)) {
                list1.add(x);
            }
        }
        Collections.sort(list1);
        for(int i:set1){
            list2.add(i);
        }
        if(list1.equals(list2)){
            System.out.println("YES");
        }
        else{
            System.out.println("NO");
        }
        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<>();
            }
            set1=new HashSet<>();
            for(int i=0;i<E;i++){
                int v=cin.nextInt();
                int w=cin.nextInt();
                set1.add(v);
                set1.add(w);
                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;
        }
    }
    private static class Paths {
        private boolean[] marked;
        private int[] edgeto;
        private final int s;
        public Paths(Graph G, int f) {
            marked=new boolean[G.V()+1];
            edgeto=new int[G.V()+1];
            this.s = f;
            dfs(G,s);
        }
        private void dfs(Graph G, int v) {
            marked[v]=true;
            for(int w:G.adj(v)){
                if(!marked[w]){
                    edgeto[w]=v;
                    dfs(G,w);
                }
            }
        }
        public boolean hasPathTo(int v){
            return marked[v];
        }
        public Iterable<Integer> pathTo(int v){
            if(!hasPathTo(v)) return null;
            Stack<Integer> path=new Stack<>();
            for(int x=v;x!=s;x=edgeto[x])
                path.push(x);
            path.push(s);
            return path;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值