地杰斯特拉算法

package 地杰斯特拉;

import java.util.Scanner;


/**
 * 一个农场有n个landmarks,有t条道路链接,问从编号为1的landmarks到编号为n的最短的距离
 * @author Administrator
 *
 */

public class Main {

    private int [][]map;//图的邻接矩阵
    private int [] dist;//距离
    private boolean flag[];
    private int n;
    private int min;
    
    Main(int n,int[][]map)
    {
        this.n = n;
        this.map = map;
        dist = new int[n+1];
        flag = new boolean[n+1];
        min = 0;
    }
    
    
    
    
    public static void main(String[] args) {
    
        Scanner input = new Scanner(System.in);
        int t = input.nextInt();
        int n = input.nextInt();
        int cost,x,y;
        int [][] map = new int[n+1][n+1];
        for(int i = 1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                map[i][j] = Integer.MAX_VALUE;
            }
        }
        for(int j=1;j<=t;j++)
        {
            x = input.nextInt();
            y = input.nextInt();
            cost = input.nextInt();
            if(cost < map[x][y])
            {
                map[x][y] = map[y][x] = cost;
            }
        }
        Main ma = new Main(n, map);
        System.out.println(ma.dijkstra());
        
        
        
        
        
        
        
    }




    private int dijkstra() {
        int min_j = 1;
        flag[1] = true;
        for(int i=2;i<=n;i++)
        dist[i] = map[1][i];//存储1到所有顶点的距离
        for(int i=2;i<=n;i++)//选一个与顶点1最近的点
        {
            min = Integer.MAX_VALUE;
            for(int j=1;j<=n;j++)
            {
                if(dist[j] < min && !flag[j]){
                    min = dist[j];
                    min_j = j;
                }
            }
            flag[min_j] = true;
            if(min_j == n)
            {
                return min;
            }
            
            for(int k=1;k<=n;k++)
            {
                if(!flag[k] && map[min_j][k] < Integer.MAX_VALUE)
                {
                    if(map[min_j][k]+dist[min_j] < dist[k])
                    {
                        dist[k] = map[min_j][k]+dist[min_j];
                    }
                }
            }
            
            
            
            
            
            
            
            
            
        }
        
        
        
        
        
        
        return min;
    }
    
}

 测试数据

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
90

posted on 2015-04-07 19:28  aicpcode  阅读(446)  评论(0编辑  收藏  举报

导航