您的位置:首页 > 其它

BZOJ 1050 [HAOI2006]旅行comf

2016-09-25 13:35 218 查看
排序+贪心

按边权排序,枚举权值最小边,贪心地从小到大选取比最小边大的边,用并查集维护连通性

#include<cstdio>
#include<algorithm>
#define M 5005
#define N 505
using namespace std;
struct edge{int a,b,v;}e[M];
const int INF=30005;
int fa
;
bool cmp(edge a, edge b){return a.v<b.v;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int gcd(int a, int b){return b?gcd(b,a%b):a;}
int main()
{
int n, m, s, t;
int ans1=INF,ans2=1;
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].v);
scanf("%d%d",&s,&t);
sort(e+1,e+1+m,cmp);
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
fa[j]=j;
for(int j = i; j <= m; j++)
{
int f1=find(e[j].a), f2=find(e[j].b);
if(f1!=f2)
fa[f1]=f2;
if(find(s)==find(t))
if(e[j].v*ans2<1.0*ans1*e[i].v)
ans1=e[j].v, ans2=e[i].v;
}
}
if(ans1==INF)printf("IMPOSSIBLE\n");
else
{
int g=gcd(ans1,ans2);
ans1/=g;
ans2/=g;
if(ans2==1)printf("%d\n",ans1);
else printf("%d/%d\n",ans1,ans2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: