hdu 1598 find the most comfortable road(并查集+枚举)

1

0

中文题目就不用说题意了并查集,排序加枚举,下边是我理解大神代码猴,自己加的注释,,唉,,只怪自己太菜2015,,7,,22

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{int sc,ec,speed;}a[1100];int f[210];int n,m;bool cmp(node a,node b){ return a.speed<b.speed; }void init() { for(int i=0;i<210;i++) f[i]=i; }int find(int k) { if(f[k]!=k)k=find(f[k]);return k; }void merge(int a,int b){ a=find(a); b=find(b); if(a!=b) f[a]=b; }int slove(int s,int e){int i,j,ans;init();for(i=0;i<m;i++)//判断是否连通 {merge(a[i].sc,a[i].ec);}if(find(s)!=find(e)) return -1;//如果不连通就返回-1 ans=0x3f3f3f;for(i=0;i<m;i++)//以每条边为起始边,这条边权就是这条线的最小速度 {init();for(j=i;j<m;j++)//依次加入边,直到连通,,ans存放最小的差值 {if(a[j].speed-a[i].speed>=ans) continue;merge(a[j].sc,a[j].ec);if(find(s)==find(e))//如果起点和终点连通时 ,此时的a[j].speed就是这条路线的最大速度{if(ans>a[j].speed-a[i].speed)ans=a[j].speed-a[i].speed;}}}return ans;}int main(){int i,t,s,e;while(~scanf("%d%d",&n,&m)){for(i=0;i<m;i++){scanf("%d%d%d",&a[i].sc,&a[i].ec,&a[i].speed);}sort(a,a+m,cmp);//按权值排序 scanf("%d",&t);while(t–){scanf("%d%d",&s,&e);printf("%d\n",slove(s,e));}}return 0;}

踮起脚尖,我们就能离幸福更近点吗?

hdu 1598 find the most comfortable road(并查集+枚举)

相关文章:

你感兴趣的文章:

标签云: