标签:
最小瓶颈路:找u到v的一条路径满足最大边权值尽量小
先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这条路径。
Time Limit: 3000MS 64bit IO Format: %lld & %llu
/*-------------------------------------------------*/ 解析:
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdlib> 6 #include<algorithm> 7 #define N 205 8 struct Edge{ 9 int u,v; 10 double w; 11 }edge[N*N]; 12 int n,t; 13 struct D{ 14 double x,y; 15 }dian[N]; 16 int father[N]; 17 void add_edge(int a,int b) 18 { 19 ++t; 20 edge[t].u=a; 21 edge[t].v=b; 22 edge[t].w=sqrt((dian[a].x-dian[b].x)*(dian[a].x-dian[b].x)+(dian[a].y-dian[b].y)*(dian[a].y-dian[b].y)); 23 } 24 bool cmp(Edge P,Edge Q) 25 { 26 return P.w<Q.w; 27 } 28 int find(int x) 29 { 30 return (father[x]==x?x:father[x]=find(father[x])); 31 } 32 void kruskal(double &ans) 33 { 34 for(int i=1;i<=n;++i) 35 father[i]=i; 36 sort(edge+1,edge+t+1,cmp); 37 for(int l=1;l<=t;++l) 38 { 39 int f1=find(edge[l].u); 40 int f2=find(edge[l].v); 41 if(f1==f2) continue; 42 father[f2]=f1; 43 if(find(1)==find(2)) /*1是起点,2是终点,在kruskal算法执行的时候第一次将两个点(或者说两个点的集合)连起来的那条边就是这两点的最小瓶颈路上最大边。*/ 44 { 45 ans=edge[l].w;/*这个性质由kruskal算法的过程即可知道*/ 46 return; 47 } 48 } 49 } 50 int main() 51 { 52 int topt=0; 53 while(scanf("%d",&n)==1) 54 { 55 topt++; 56 if(n==0) break; 57 t=0; 58 for(int i=1;i<=n;++i) 59 { 60 scanf("%lf%lf",&dian[i].x,&dian[i].y); 61 if(i==1)continue; 62 for(int j=1;j<i;++j) 63 add_edge(j,i); 64 } 65 double ans; 66 kruskal(ans); 67 printf("Scenario #%d\n",topt); 68 printf("Frog Distance = %0.3lf\n\n",ans); 69 } 70 return 0; 71 }
标签:
原文地址:http://www.cnblogs.com/c1299401227/p/5808439.html