标签:
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
10
中文题目就不用说题意了 并查集,排序加枚举,下边是我理解大神代码猴,自己加的注释,,唉,,只怪自己太菜 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(并查集+枚举)
标签:
原文地址:http://blog.csdn.net/ling_du/article/details/47009889