标签:
题意:给出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; }
标签:
原文地址:http://www.cnblogs.com/NaCl/p/4862558.html