图论--单源最短路-稠密图 Dijkstra求最短路 I

https://www.acwing.com/problem/content/851/

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式
第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围
1≤n≤500,
1≤m≤105,
图中涉及边长均不超过10000。

输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3

import java.util.*;

public class Main
{
	static int N=505,M=100005,n,m;
	static int g[][]=new int [N][N];
	static boolean st[]=new boolean[N];
	static int dist[]=new int [N];
	
	static int dijkstra(int u)
	{
		Arrays.setAll(dist, x->0x3f3f3f3f);
		dist[u]=0;
		for(int i=0;i<n;++i)
		{
			int t=-1;
			for(int j=1;j<=n;++j)
			{
				if(!st[j]&&(t==-1||dist[j]<dist[t]))t=j;
			}
			st[t]=true;
			
			for(int j=1;j<=n;++j)
				dist[j]=Math.min(dist[j], dist[t]+g[t][j]);
		}
		if(dist[n]==0x3f3f3f3f) return -1;
		else return dist[n];
	}
	public static void main(String args[])
	{
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		for(int i1=1;i1<=n;++i1)Arrays.setAll(g[i1], x->0x3f3f3f3f);
		for(int i=0;i<m;++i)
		{
			int a,b,c;
			a=sc.nextInt();
			b=sc.nextInt();
			c=sc.nextInt();
			g[a][b]=Math.min(g[a][b], c);
		}
		int ans=dijkstra(1);
		System.out.println(ans);
	}
}
posted @ 2022-11-17 23:03  林动  阅读(10)  评论(0编辑  收藏  举报