題目描述
AC代碼
import java.util.*;
public class Main{
static Scanner scan=new Scanner(System.in);
static class Graph{
final int inf=0x3fffffff,maxn=500;
private final int vertex,edges,start,des;
private Integer[][] G=new Integer[maxn][maxn];
private Integer[] d=new Integer[maxn];
private Integer[] c=new Integer[maxn];
private Integer[][] cost=new Integer[maxn][maxn];
private Integer[] pre=new Integer[maxn];
private Boolean[] vis=new Boolean[maxn];
Graph() {
vertex=scan.nextInt();
edges=scan.nextInt();
start=scan.nextInt();
des=scan.nextInt();
for(int i=0;i<maxn;i++) {
for(int j=0;j<maxn;j++) G[i][j]=inf;
}
Arrays.fill(vis,false);
for(int i=0;i<edges;i++) {
int c1=scan.nextInt(),c2=scan.nextInt();
int td=scan.nextInt(),tc=scan.nextInt();
G[c1][c2]=G[c2][c1]=td;
cost[c1][c2]=cost[c2][c1]=tc;
}
}
void Dijkstra() {
Arrays.fill(d,inf);
for(int i=0;i<vertex;i++) pre[i]=i;
c[start]=d[start]=0;
for(int i=0;i<vertex;i++) {
int u=-1,min=inf;
for(int j=0;j<vertex;j++) {
if(vis[j]==false&&d[j]<min) {
u=j;min=d[j];
}
}
if(u==-1) return;
vis[u]=true;
for(int v=0;v<vertex;v++) {
if(vis[v]==false&&G[u][v]!=inf) {
if(d[u]+G[u][v]<d[v]) {
d[v]=d[u]+G[u][v];
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
else if(d[u]+G[u][v]==d[v]&&c[u]+cost[u][v]<c[v]) {
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
void dfs(int v) {
if(v==start) {
System.out.print(v+" ");
return;
}
dfs(pre[v]);
System.out.print(v+" ");
}
}
public static void main(String[] args) {
Graph graph=new Graph();
graph.Dijkstra();
graph.dfs(graph.des);
System.out.print(graph.d[graph.des]+" "+graph.c[graph.des]);
}
}