最小环

来源:互联网 发布:经营数据分析 编辑:程序博客网 时间:2024/06/04 05:33

啊哈哈今天搞了搞最小环

嗯就是Floyd 我们不能那么直奔主题

首先有一种想法是Dijkstra

对于图中的每一条边(a,b),把它删除后求a-b的最短路

时间复杂度O(nlognm)[前提是你要用恶心死人的Dijkstra with heap]

所以我们就想到了Floyd

d[i,j]是初始图 f[i,j]是那个最短路的数组

设f[k,i,j]表示从i到j的路径中经过点最大不超过k的最短路长度

然后可得ans:=min(ans,f[k-1,i,j]+d[i,k]+d[j,k])

然后就没了

可用滚动数组优化空间

代码各种炫酷

const   INF=1 shl 25;vard,f:array[0..101,0..101] of longint;n,m,a,b,c,ans,i,j,k:longint;procedure init;beginreadln(n,m);for i:=1 to n do for j:=1 to n do d[i,j]:=INF;for i:=1 to m dobeginreadln(a,b,c);d[a,b]:=c;d[b,a]:=c;end;ans:=INF;end;function min(a,b:longint):longint;inline;//这个inline各种重要 快了0.5s+beginif a<b then exit(a);exit(b);end;procedure main;begininit;f:=d;for k:=1 to n dobeginfor i:=1 to k dofor j:=i+1 to k do//这个i+1及其重要,反正i和j循环的时候不能相等就是了ans:=min(ans,f[i,j]+d[i,k]+d[j,k]);for i:=1 to n dofor j:=1 to n dof[i,j]:=min(f[i,j],f[i,k]+f[k,j]);end;if ans=INF then writeln('No solution.')   else writeln(ans);end;begin        main;end.


0 0
原创粉丝点击