UVA 10099(kruskal/Floyd)

来源:互联网 发布:梭哈游戏c 算法实现 编辑:程序博客网 时间:2024/05/21 22:47

传送门
题解:
求每条路径上最小权值的最大值,数据范围是出给Floyd,但是可以用kruskal构造最大生成树实现。
P.S.本人做UVA说是要巩固基础,另一大原因就是想刷点访问量╮(╯▽╰)╭,一道大水题做了接近半个小时,真是点背。。。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int MAXN=105,MAXM=MAXN*MAXN;int n,m,fa[MAXN],st,ed,sum;struct EDGE {    int u,v,w;    bool operator <(const EDGE &x) const {        return w>x.w;    }}e[MAXM];inline int read() {    int x=0;char c=getchar();    while (c<'0'||c>'9') c=getchar();    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x;}int find(int x) {    return fa[x]==x?x:fa[x]=find(fa[x]);}int main() {    int kase=0;    while (scanf("%d%d",&n,&m)&&(n||m)) {        for (int i=1;i<=n;++i) fa[i]=i;        for (int i=0;i<m;++i) e[i].u=read(),e[i].v=read(),e[i].w=read();        sort(e,e+m);        int num;        st=read(),ed=read(),sum=read();        for (int i=0;i<m;++i) {            int u=e[i].u,v=e[i].v;            u=find(u),v=find(v);            if (u^v) {                fa[u]=v,num=e[i].w;                if (find(st)==find(ed)) break;            }        }        printf("Scenario #%d\n",++kase);        printf("Minimum Number of Trips = %d\n\n",(int)ceil(1.0*sum/(1.0*num-1.0)));    }    return 0;}
原创粉丝点击