10099 The Tourist Guide

题意:给出n的城市m条通道,然后每条通道最大的承载人数给出来了,然后给出起点和终点以及要搭载的人数,问最少要走多少次才能把全部游客送到目的地

因为导游每次都要跟团,所以每条交通道路搭载的最大人数要减1= =

克鲁斯卡尔算法,就会排序的时候按照运输人数的从大到小排序,然后当起点和终点在一个联通分支时即可

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
int n,m;
int p[maxn];
struct node
{
    int u,v,num;
};
bool cmp(node a,node b)
{
    return a.num>b.num;
}
void init()
{
    for(int i=1;i<=n;i++)
    p[i]=i;
}
int find(int x)
{
    return p[x]==x ? x :find(p[x]);
}
node a[maxn];
int main()
{
    int t=0;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        if(!n&&!m) 
        break;
        init();
        for(int i=0;i<m;i++)
        {
            scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].num);
        }
        sort(a,a+m,cmp);
        int s,e,sum;
        scanf("%d %d %d",&s,&e,&sum);
        int k=0;
        for(int i=0;i<m;i++)
        {
            int fx=find(a[i].u);
            int fy=find(a[i].v);
            if(fx!=fy)
            p[fx]=fy;
            if(find(s)==find(e))
            {
                k=i;
                break;
            }
        } 
        int num=a[k].num;
        num--; 
        int ans;
        if(sum%num==0)
        ans=sum/num;
        else
        ans=sum/num+1;
        printf("Scenario #%d
",++t);
        printf("Minimum Number of Trips = %d

",ans);
    }
    return 0;
}