已知边,判断2点连通性
要用并查集……千万别搜啊~
Program ee; var edge:array[1..10000,1..3] of longint; s,t,n,m,i,j,pmax,pmin:longint; father:array[1..1000] of longint; procedure swap(var a,b:longint); var p:longint; begin p:=a; a:=b; b:=p; end; procedure qsort(l,r:longint); var i,j,m,p:longint; begin i:=l; j:=r; m:=edge[(l+r) shr 1,3]; repeat while edge[i,3]<m do inc(i); while edge[j,3]>m do dec(j); if i<=j then begin swap(edge[i,1],edge[j,1]); swap(edge[i,2],edge[j,2]); swap(edge[i,3],edge[j,3]); inc(i);dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; function gcd(a,b:longint):longint; begin if b=0 then exit(a) else exit(gcd(b,a mod b)); end; function getfather(x:longint):longint; begin if father[x]=x then exit(x) else father[x]:=getfather(father[x]); exit(father[x]); end; begin pmax:=50000000;pmin:=1; read(n,m); for i:=1 to m do read(edge[i,1],edge[i,2],edge[i,3]); read(s,t); qsort(1,m); i:=1; for i:=1 to m do begin for j:=1 to n do father[j]:=j; j:=i; while (getfather(s)<>getfather(t)) and (j<=m) do begin if getfather(edge[j,2])<>getfather(edge[j,1]) then father[father[edge[j,2]]]:=father[father[edge[j,1]]]; inc(j); end; if getfather(s)=getfather(t) then begin dec(j); if (pmax/pmin>edge[j,3]/edge[i,3]) then begin pmax:=edge[j,3]; pmin:=edge[i,3]; end; end; end; if pmax=50000000 then writeln('IMPOSSIBLE') else if (pmax mod pmin=0) then writeln(pmax div pmin) else begin i:=gcd(pmax,pmin); pmax:=pmax div i;pmin:=pmin div i; writeln(pmax,'/',pmin); end; end.