import java.util.*;
public class TU {
public static void main(String args[]) {
Scanner in=new Scanner(System.in);
while(in.hasNext()) {
int v=in.nextInt();
int numse=in.nextInt();
//使用G表示稀疏矩阵
G g=new G(v);
for(int i=0;i<numse;i++) {
int start=in.nextInt();
int end=in.nextInt();
int value=in.nextInt();
g.AddE(Math.min(start,end), Math.max(start, end),value);
}
System.out.println(g.Dijisi());
}
}
}
class G{
public int v;
public int size=0;
//使用map保存边E的信息,有助于查询
public Map<String,Integer> E=new HashMap<String,Integer>();
G(int vv){
this.v=vv;
}
//注意start<end,另外已经有权值的边,当再次输入一个权值时,应该判断是否需要更新次权值
public void AddE(int start,int end,int value) {
String str=new String(start+" "+end);
if(E.containsKey(str)) {
int tempvalue=E.get(str);
E.put(str, Math.min(tempvalue, value));
}else {
E.put(str,value);
++size;
}
}
//遍历map输出结果
public void Print() {
for(String str:E.keySet()) {
System.out.println(str+" "+E.get(str));
}
}
//查询是否存在某一边(路径)
public int Find(int start,int end) {
String str=new String(start+" "+end);
if(E.containsKey(str)) {
return E.get(str);
}else {
return Integer.MAX_VALUE;
}
}
//使用迪杰斯塔拉求解单源最短路径
public int Dijisi() {
int dist[]=new int[v+1];
int visit[]=new int[v+1];
for(int i=2;i<=v;i++) {
dist[i]=Find(1,i);
}
for(int i=2;i<=v;i++) {
int pos=-1;
int mind=Integer.MAX_VALUE;
for(int j=2;i<=v;i++) {
if(visit[j]==0) {
if(mind>dist[j]) {
mind=dist[j];
pos=j;
}
}
}
visit[pos]=1;
if(mind==Integer.MAX_VALUE) { //防止溢出
continue;
}else {
for(int k=2;k<=v;k++) {
int t_k_pos=Find(Math.min(k,pos),Math.max(k,pos));
if(t_k_pos==Integer.MAX_VALUE) {
continue;
}else {
if(t_k_pos+dist[pos]<dist[k]) {
dist[k]=t_k_pos+dist[pos];
}
}
}
}
}
return dist[v];
}
}
稀疏图的表示G&地杰斯特拉求解单源最短路径
最新推荐文章于 2022-11-02 19:36:14 发布