https://www.lydsy.com/JudgeOnline/problem.php?id=1050
最小生成树变形 没想到.. 一开始想的枚举最小二分最大 但是这些边无法确定走不走
枚举每条边作为最小值 然后用所有大于等于该值的边跑最小生成树 当起点终点连通时就退出 这样第一和最后一条被选中的边就是最小和最大边
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define N 0x3f3f3f3f
struct node
{
int u;
int v;
ll w;
};
node edge[5010];
int f[510];
int n,m,s,e;
bool cmp(node n1,node n2)
{
return n1.w<n2.w;
}
int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}
bool unite(int u,int v)
{
int fu,fv;
fu=getf(u);
fv=getf(v);
if(fu!=fv)
{
f[fv]=fu;
return true;
}
else return false;
}
ll getgcd(ll a,ll b)
{
ll t;
while(b>0)
{
t=b;
b=a%b;
a=t;
}
return a;
}
int main()
{
ll a,b,maxx,res;
int i,j,cnt;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=m;i++)
{
scanf("%d%d%lld",&edge[i].u,&edge[i].v,&edge[i].w);
}
scanf("%d%d",&s,&e);
sort(edge+1,edge+m+1,cmp);
a=N,b=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++) f[j]=j;
maxx=0,cnt=0;
for(j=i;j<=m;j++)
{
if(unite(edge[j].u,edge[j].v))
{
maxx=max(maxx,edge[j].w);
cnt++;
}
if(cnt==n-1||getf(f[s])==getf(f[e])) break;
}
if(maxx!=0&&getf(f[s])==getf(f[e])&&a*edge[i].w>b*maxx)
{
a=maxx,b=edge[i].w;
}
}
if(a==N) printf("IMPOSSIBLE\n");
else
{
if(a%b==0) printf("%lld\n",a/b);
else
{
res=getgcd(a,b);
printf("%lld/%lld\n",a/res,b/res);
}
}
}
return 0;
}