party.in
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
party.out
10
看了题目都应该直到是最短路,只需两次即可
一次求出x到所有点的最短路 ,这个很好实现
第二次求出所有点到x的最短路,这个只需要在迭代更新的时候吧map[k,j]改成map[j,k]即可,这样就成了反向边,就可以求出所有点到x的最短路
program party;
var
n,m,x:longint;
map:array[0..1000+10,0..1000+10] of longint;
dist:array[0..1000+10] of longint;//x 到 所有点的最短距离
dis:array[0..1000+10] of longint;//所有点 到 x 的最短距离
h:array[0..1000+10] of boolean;
procedure init;
begin
assign(input,'party.in');
assign(output,'party.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure readdata;
var
i,xx,yy:longint;
begin
read(n,m,x);
fillchar(map,sizeof(map),$7);
for i:=1 to m do
read(xx,yy,map[xx,yy]);
end;
procedure dij;
var
i,j,k,min:longint;
begin
for i:=1 to n do
begin
//find min
min:=maxlongint; k:=0;
for j:=1 to n do
if (not h[j])and(min>dist[j]) then
begin
min:=dist[j];k:=j;
end;
//color it
h[k]:=true;
//renew
for j:=1 to n do
begin
if (not h[j])and(dist[j]>dist[k]+map[k,j]) then
dist[j]:=dist[k]+map[k,j];
end;
end;
end;
procedure dijs;
var
i,j,k,min:longint;
begin
for i:=1 to n do
begin
//find min
min:=maxlongint;k:=0;
for j:=1 to n do
if (not h[j])and(min>dis[j]) then
begin
min:=dis[j];k:=j;
end;
//color it
h[k]:=true;
//renew
for j:=1 to n do
if (not h[j])and(dis[j]>dis[k]+map[j,k]) then
dis[j]:=dis[k]+map[j,k];
end;
end;
procedure main;
var
i,sum,max:longint;
begin
{//O(n3)的算法
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if map[i,j]>map[i,k]+map[k,j] then
map[i,j]:=map[i,k]+map[k,j];
for i:=1 to n do dist[i]:=map[i,x]+map[x,i];
dist[x]:=0;
max:=0;
for i:=1 to n do
if max