• [BZOJ3397] [Usaco2009 Feb]Surround the Islands 环岛篱笆(DFS)


    3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 42  Solved: 27
    [Submit][Status][Discuss]

    Description

        约翰在加勒比海买下地产,准备在这里的若干个岛屿上养奶牛.所以,他要给所有岛屿围上篱笆.每个岛屿都是多边形.他沿着岛屿的一条边界朝一个方向走,有时候坐船到另一个岛去.他可以从任意一个多边形顶点开始修篱笆的工作;在任意一个到达的顶点,他可以坐船去另一个岛屿的某个顶点,但修完那个岛的篱笆,他必须马上原路返回这个出发的岛屿顶点.任意两个顶点间都有肮线,每条航线都需要一定的费用.请帮约翰计算最少的费用,让他修完所有篱笆.

    Input

        第1行输入N(3≤N≤500),表示所有岛屿多边形的个数.
        接下来N行每行输入两个整数V1和V2(1≤V1≤N;1≤V2≤N),表示一条构成岛屿的线段的两个端点.接下来输入N行N列的矩阵,表示两个顶点间航行所需费用.

    Output

     
        一个整数,最少费用.

    Sample Input

    12
    1 7
    7 3
    3 6
    6 10
    10 1
    2 12
    2 9
    8 9
    8 12
    11 5
    5 4
    11 4
    0 15 9 20 25 8 10 13 17 8 8 7
    15 0 12 12 10 10 8 15 15 8 8 9
    9 12 0 25 20 18 16 14 13 7 12 12
    20 12 25 0 8 13 14 15 15 10 10 10
    25 10 20 8 0 16 20 18 17 18 9 11
    8 10 18 13 16 0 10 9 11 10 8 12
    10 8 16 14 20 10 0 18 20 6 16 15
    13 15 14 15 18 9 18 0 5 12 12 13
    17 15 13 15 17 11 20 5 0 22 8 10
    8 8 7 10 18 10 6 12 22 0 11 12
    8 8 12 10 9 8 16 12 8 11 0 9
    7 9 12 10 11 12 15 13 10 12 9 0

    Sample Output

    30
     
     
    乱搞题。
    唯一的称得上是算法的大概就是图上找环,用了一个类似DFS的东东。(其实也不算是典型的DFS吧。)找完环之后,缩点,压点距。不用求最短路。答案就是单点到所有点距离之和的最小值乘2。
     
    /**************************************************************
        Problem: 3397
        User: ecnu161616
        Language: C++
        Result: Accepted
        Time:144 ms
        Memory:4124 kb
    ****************************************************************/
     
    #include <bits/stdc++.h>
    using namespace std;
     
    int n, dis[600][600], M;
    vector<int> g[600];
    vector<int> islands[600];
    int isldis[600][600];
    int vis[600], islandno[600];
    int ans;
    const int inf = 1e9 + 7;
     
    void travel(vector<int> &res, int id, int i) {
        vis[i] = 1;
        while (true) {
            res.push_back(i);
            islandno[i] = M;
            int v = -1;
            for (int j = 0; j < g[i].size(); ++j)
                if (!vis[g[i][j]]) {
                    v = g[i][j];
                    break;
                }
            if (v == -1) break;
            vis[v] = 1;
            i = v;
        }
    }
     
    int main()
    {
        #ifdef ULTMASTER
        freopen("a.in","r",stdin);
        #endif
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) {
            int u, v;
            scanf("%d %d", &u, &v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        for (int i = 1; i <= n; ++i)
            if (!vis[i]) {
                ++M; travel(islands[M], M, i);
            }
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                scanf("%d", &dis[i][j]);
        for (int i = 1; i <= M; ++i)
            for (int j = 1; j <= M; ++j)
                isldis[i][j] = inf;
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                isldis[islandno[i]][islandno[j]] = min(isldis[islandno[i]][islandno[j]], dis[i][j]);
        ans = inf;
        for (int i = 1; i <= M; ++i) {
            int res = 0;
            for (int j = 1; j <= M; ++j)
                res += isldis[i][j];
            res *= 2;
            ans = min(ans, res);
        }
        printf("%d
    ", ans);
        return 0;
    }
    

      

  • 相关阅读:
    eclipse fail to create java virtual machine
    sas软件连接Oracle数据库的办法
    JAVA中数据的读取与写入,不同类型数据的转换
    二维数组的在函数中的传递
    【转】值传递与引用传递
    【转】深拷贝与浅拷贝
    (转)JS报表控件highcharts应用
    highstocks.js使用指南
    (转)Highcharts使用指南(出处:http://liuhaorain.cnblogs.com )
    jQuery实现checkbox全选,反选
  • 原文地址:https://www.cnblogs.com/ultmaster/p/6073420.html
Copyright © 2020-2023  润新知