【九度】题目1414:旅游啦

题目地址: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号城市出发,周游其他城市的最短旅游行程。

样例输入:
5
0 1 10
0 3 10
0 4 100
1 2 10
4 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
****************************************************************/ 

你可能感兴趣的:(【九度】题目1414:旅游啦)