一直50分
查看原帖
一直50分
370599
why_cb楼主2022/7/11 20:05

已经疯狂了

最后五个点一直wa

有哪位大佬帮忙看看

#include<bits/stdc++.h>
using namespace std;

const int N=586,M=5086;

int n,m,s,t,ds[N];
struct Edge
{
	int u;
	int v;
	int w;
	bool operator <(const Edge &a)const{
		return w<a.w;
	}
}edge[M];

int find(int a){return ds[a]==a?a:ds[a]=find(ds[a]);}
void add(int a,int b){ds[a]=find(b);}

int kruskal(int minn)
{
	for(int i=1;i<=n;i++) ds[i]=i;
	int ans=0;
	for(int i=minn;i<=m;i++)
	{
		if(find(edge[i].u)!=find(edge[i].v))
		{
			add(edge[i].u,edge[i].v);
			if(find(s)==find(t))
			{
				ans=edge[i].w;
				break;
			}	
		}
		
	}
	return ans;
}

inline int read()
{
	int X=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
	return X*w;
}

int gcd(int a,int b)
{
	if(b==0)	return a;
	else return gcd(b,a%b); 
}

int main()
{
	n=read();
	m=read();
	for(int i=1;i<=m;i++)
		edge[i].u=read(),edge[i].v=read(),edge[i].w=read();
	s=read();
	t=read();
	sort(edge+1,edge+1+m);
	int ans1=50000,ans2=1;
	for(int i=1;i<=m;i++)
	{
		int maxx=kruskal(i);
		if(maxx==0) continue;
		if(maxx*ans2<ans1*edge[i].w) 
			ans1=maxx,ans2=edge[i].w;
	}
	if(ans1==50000)
		printf("IMPOSSIBLE");
	else
		if(ans1%ans2==0) printf("%d",ans1/ans2);
		else printf("%d/%d",ans1/gcd(ans1,ans2),ans2/gcd(ans1,ans2));
	return 0;
}

2022/7/11 20:05
加载中...