题目描述
在给出数据里找出最小环。若没有则输出’No solution’
样例输入
样例1
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
样例2
4 3
1 2 10
1 3 20
1 4 30
样例输出
样例1
61
样例2
No solution
算法讨论
用g数组表示i到j的距离,d为最短路径。我们在floyd时顺便算出最小环,根据环的定理,当前部分环表示为g[i,k]+g[k,j]+d[i,j]。
const
maxn=100;
var
a,d:array[1..maxn,1..maxn] of longint;
i,j,k,n,m,s,x,y,w:longint;
function min(x,y:longint):longint;
begin
if x<y
then exit(x)
else exit(y)
end;
begin
read(n,m);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=maxlongint div 3;
for i:=1 to m do
begin
read(x,y,w);
a[x,y]:=w;
a[y,x]:=w
end;
d:=a;
s:=maxlongint div 3;
for k:=1 to n do
begin
for i:=1 to n do
for j:=i+1 to n do
s:=min(s,d[i,j]+a[i,k]+a[k,j]);
for i:=1 to n do
for j:=1 to n do
d[i,j]:=min(d[i,j],d[i,k]+d[k,j])
end;
if s<>maxlongint div 3
then write(s)
else write('No solution')
end.
Pixiv ID:60268880