10099 The Tourist Guide

来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/06/14 14:12
题意:给出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\n",++t);        printf("Minimum Number of Trips = %d\n\n",ans);    }    return 0;}

 

0 0
原创粉丝点击