• Uva 208 Firetruck


    大致思路:其实用dfs就可以解决,但是只用dfs的话,会导致超时。在进行dfs前,应该判断一下从1点能否到达目的地,这样就不会超时了,估计是测试数据中有很多是从1点无法到达目的地的。

        判断能否到达可以用bfs判断,在这道题里,效率还算不错。

    C++代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <vector>
    
    using namespace std;
    
    const int MAXN = 20 + 5;
    vector <int> link[MAXN];
    int path[MAXN], vis[MAXN];
    int N, counter;
    
    void Init() {
        for(int i=0; i<MAXN; ++i) {
            link[i].clear();
        }
    }
    
    void Read() {
        int x, y;
        while(true) {
            scanf("%d%d", &x, &y);
            if(!x && !y) {
                break;
            }
            link[x].push_back(y);
            link[y].push_back(x);
        }
        for(int i=0; i<MAXN; i++) {
            if(link[i].size()) {
                sort(link[i].begin(), link[i].end());
            }
        }
    }
    
    void Print(int cur) {
        for(int i = 1; i < cur; ++ i) {
            printf("%d ", path[i]);
        }
        printf("%d
    ", path[cur]);
    }
    
    void Dfs(int value, int cur) {
        if(value == N) {
            ++ counter;
            Print(cur);
            return ;
        }
        for(size_t i = 0; i < link[value].size(); ++ i) {
            int node = link[value][i];
            if(!vis[node]) {
                vis[node] = 1;
                path[cur+1] = node;
                Dfs(node, cur + 1);
                vis[node] = 0;
            }
    
        }
    }
    
    bool IsConnect() {
        queue<int> q;
        q.push(1);
        bool is[MAXN] = {false};
        is[1] = true;
        while(!q.empty()) {
            int t = q.front();
            q.pop();
            if(t == N) {
                return true;
            }
            for(size_t i = 0; i < link[t].size(); ++ i) {
                if(!is[link[t][i]]) {
                    is[link[t][i]] = true;
                    q.push(link[t][i]);
                }
            }
        }
        return false;
    }
    
    int main() {
        int Case = 0;
        while(scanf("%d", &N)!=EOF) {
            Init();
            Read();
            counter = 0;
            printf("CASE %d:
    ", ++Case);
            if(IsConnect()) {
                memset(vis, 0, sizeof(vis));
                vis[1] = 1;
                path[1] = 1;
                Dfs(1, 1);
            }
            printf("There are %d routes from the firestation to streetcorner %d.
    ", counter, N);
        }
        return 0;
    }
    

    试着用java写了一下

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    /**
     * Created by emerald on 8/8/15.
     * uva208
     */
    public class Main {
        public static void main(String []args) {
            Scanner in = new Scanner(System.in);
            int Case = 0;
            while (in.hasNext()) {
                N = in.nextInt();
                init();
                read(in);
                System.out.println("CASE " + (++Case) +":");
                counter = 0;
                if(isConnect()) {
                    boolean vis[] = new boolean[MAXN];
                    int path[] = new int[MAXN];
                    for(int i=0; i<vis.length; ++ i) {
                        vis[i] = false;
                    }
                    vis[1] = true;
                    path[1] = 1;
                    dfs(1, 2, vis, path);
                }
                System.out.println("There are "+ counter +" routes from the firestation to streetcorner " + N +".");
            }
        }
    
        public static int MAXN = 20 + 5;
        public static int N, counter;
        public static ArrayList<Integer> link[] = new ArrayList[MAXN];
    
        public static void init() {
            for(int i=0; i<link.length; ++ i) {
                link[i] = new ArrayList<>();
            }
        }
        public static void read(Scanner in) {
            int x, y;
            while (in.hasNext()) {
                x = in.nextInt();
                y = in.nextInt();
                if(x == 0 && y == 0) {
                    break;
                }
                link[x].add(y);
                link[y].add(x);
            }
            for(int i=0; i<link.length; ++ i) {
                if(link[i].size() > 0) {
                    Collections.sort(link[i]);
                }
            }
        }
    
        public static boolean isConnect() {
            int q[] = new int[MAXN * MAXN];
            int front = 0, rear = 1;
            boolean vis[] = new boolean[MAXN];
            for(int i=0; i<vis.length; ++ i) {
                vis[i] = false;
            }
            q[front] = 1;
            vis[1] = true;
            while (front < rear) {
                int t = q[front];
                if(t == N) {
                    return true;
                }
                for(int i=0; i<link[t].size(); ++ i) {
                    int value = link[t].get(i);
                    if(!vis[value]) {
                        vis[value] = true;
                        q[rear ++] = value;
                    }
                }
                ++ front;
            }
            return false;
        }
    
        public static void dfs(int value, int cur, boolean vis[], int path[]) {
            if(value == N) {
                ++ counter;
                print(path, cur);
                return;
            }
            for(int each:link[value]) {
                if(!vis[each]) {
                    vis[each] = true;
                    path[cur] = each;
                    dfs(each, cur+1, vis, path);
                    vis[each] = false;
                }
            }
        }
    
        public static void print(int path[], int cur) {
            for(int i=1; i<cur-1; i++) {
                System.out.print(path[i] + " ");
            }
            System.out.println(path[cur-1]);
        }
    }
    
  • 相关阅读:
    Java_io_02_从一个目录拷贝文件到另一个目录下
    JavaUtil_02_二维码的生成与解析
    Oracle_Exception_01_The Network Adapter could not establish the connection
    Linux_笔记_01_设置静态IP与 SecureCRT连接Linux
    Mybatis_笔记_01_逆向工程
    Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size
    Java_总结_00_资源贴
    Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器
    Java企业微信开发_05_消息推送之被动回复消息
    Java企业微信开发_04_消息推送之发送消息(主动)
  • 原文地址:https://www.cnblogs.com/Emerald/p/4714779.html
Copyright © 2020-2023  润新知