【九度】题目1414:旅游啦

来源:互联网 发布:澳大利亚移民知乎 编辑:程序博客网 时间:2024/05/17 06:27
题目地址:http://ac.jobdu.com/problem.php?pid=1414
题目描述:
你们可曾计划过今年暑假的毕业旅行呢?当年阳仔毕业旅行时,本来预计去的10个城市,结果因为没做足准备,才去了5个城市,并且白浪费了很多大洋在一个城市周转。今年他为了弥补上回的缺憾,打算再一次周游旅行,并且这次他计划了50个城市!!!阿门!!!
你们也知道的,周游旅行需要大笔费用。因此,阳仔打算坐动车,并将所到城市都拍张照片留作纪念。暑假2个月时间并不是所有城市都有动车可以直达的,如果某个城市没有动车,那他只能放弃去那个城市了。另外,可以保证如果动车可以从A->B,那么这班动车也可以从B->A。请你帮阳仔算下,阳仔开始所在城市编号为0,要到达所有的其他可以到达的城市,这一波旅行的最短路程是多少?

输入:
输入有多组测试案例,每个测试案例为m+1行。
第一行输入一个整数m表示有m条线路,接下去的m行,每行输入3个整数表示动车线路的始发点和路程。(城市编号从0 开始到 49,注意,不是所有的城市都可能有线路可以到达,我们保证给出的数据可以构成连通图并且至少有一条线路包含0。并且保证图没有环、没有重边,实际上已被简化为一棵树。

输出:
对应每个测试案例,输出从0号城市出发,周游其他城市的最短旅游行程。

样例输入:
50 1 100 3 100 4 1001 2 104 5 5
样例输出:
165
提示:
案例中出现6个城市,因此阳仔要访问其余5个城市的最短旅游路线是:0->1->2->1->0->3->0->4->5
dijkstra算法的变形。
从0点出发,求出0点到其他点的最短距离。
我们考虑以0为中转点。
比如到1以后,1不能到其他城市,就返回到0,继续去其他城市。
除了最长路走一遍以外,其他都需要往返一次。也就是距离*2。
最后的结果就是2*总距离-最大距离。
C++ AC
#include <stdio.h>#include <string.h>#define INF 10000000;const int maxn = 50; int path[maxn][maxn];int minLen[maxn];int visited[maxn];int m,i,j;int dijkstra(){    minLen[0] = 0;    visited[0] = 1;    int minj = 0;    for(i = 0; i < maxn; i++){        int min = INF;        for(j = 0; j < maxn; j++){            if(visited[j] == 0 && minLen[j] < min){                min = minLen[j];                minj = j;            }        }        visited[minj] = 1;        for(j = 0; j < maxn ; j++){            if (visited[j] == 0 && minLen[j] > (minLen[minj] + path[minj][j])) {                minLen[j] = minLen[minj] + path[minj][j];            }        }    }    int maxLen = 0;    for (i = 1; i < maxn; i++) {        if(maxLen < minLen[i] && minLen[i] < 10000000){            maxLen = minLen[i];        }    }    return maxLen;}int main(){    while(scanf("%d",&m) != EOF){        for(i = 0; i < maxn; i++){            for(j = 0; j < maxn; j++){                path[i][j] = INF;            }        }        int sum = 0;        for(i = 0; i < m; i++){            int a,b,d;            scanf("%d%d%d",&a,&b,&d);            if(path[a][b] > d){                path[a][b] =d;                path[b][a] = d;                sum += d;            }        }        memset(visited,0,sizeof(visited));        for(i = 1; i < maxn; i++){            minLen[i] = path[0][i];        }        int maxLen = dijkstra();        printf("%d\n",2*sum - maxLen);    }    return 0;} /**************************************************************    Problem: 1414    User: wangzhenqing    Language: C++    Result: Accepted    Time:30 ms    Memory:1032 kb****************************************************************/
Java AC
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StreamTokenizer; public class Main {    /*     * 1414     */    private static int n = 50;    public static void main(String[] args) throws Exception {        StreamTokenizer st = new StreamTokenizer(                new BufferedReader(new InputStreamReader(System.in)));        while (st.nextToken() != StreamTokenizer.TT_EOF) {            int m = (int) st.nval;              int cost[][] = new int[n][n];            for (int i = 0; i < n; i++) {                for (int j = 0; j < n; j++) {                    cost[i][j] = Integer.MAX_VALUE;                }            }            int sum = 0;            for (int i = 0; i < m; i++) {                st.nextToken();                 int a = (int) st.nval;                 st.nextToken();                 int b = (int) st.nval;                 st.nextToken();                 int d = (int) st.nval;                 if (cost[a][b] > d ) {                    cost[a][b] = d;                    cost[b][a] = d;                    sum += d;                }            }            int minCost[] = new int[n];            int visit[] = new int[n];                         for (int i = 0; i < n; i++) {                minCost[i] = cost[0][i];            }            int maxLen = dijkstra(cost , minCost , visit);            System.out.printf("%d\n",2*sum - maxLen);        }    }         private static int dijkstra(int[][] cost ,int[] minCost, int[] visit) {        minCost[0] = 0;        visit[0] = 1;        int minj = 0;        for (int i = 0; i < n; i++) {            int min = Integer.MAX_VALUE;            for (int j = 0; j < n; j++) {                if (visit[j] == 0 && minCost[j] < min) {                    min = minCost[j];                    minj = j;                }            }            visit[minj] = 1;            for (int j = 0; j < n; j++) {                if (visit[j] == 0 && minCost[j] > (minCost[minj] + cost[minj][j])                        && minCost[minj] != Integer.MAX_VALUE && cost[minj][j] != Integer.MAX_VALUE) {                    minCost[j] = minCost[minj] + cost[minj][j];                }            }        }        int maxLen = 0;        for (int i = 0; i < n; i++) {            if(maxLen < minCost[i]&& minCost[i] != Integer.MAX_VALUE){                maxLen = minCost[i];            }        }        return maxLen;    }}/**************************************************************    Problem: 1414    User: wzqwsrf    Language: Java    Result: Accepted    Time:400 ms    Memory:24856 kb****************************************************************/
0 0
原创粉丝点击