find the most comfortable road HDU - 1598
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
1 0
题目大意:输入多个n个城市,m条路,一下是m行路的数据,每行三个数起始城市与终点城市和之间
的乘车速度,再输入一个k值,一下k行两个数据分别是起始城市与目的城市,看是否能到达,如果能
输出之间道路速度间的最小差值,如果不能输出-1。
思路及方法:两层for循环第一层是假定有每条路可达,判断可达的用minn存两个差值最小的,第二层
并查集与kruskal判断是否可达,如果可达求判断求出差值最小也就是题意所说的舒适度最好的。如果
判断两城市间不可达,输出-1,否则就输出minn。注意并查集先按速度从小到大排序,还有初始化。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; # define INF 0x3f3f3f3f int f[206],n,m,k; struct edge { int x,y,s; } q[1010]; int cmp(edge a,edge b) { return a.s<b.s; } void init() { for(int i=1; i<=n; i++) f[i]=i; } int getf(int v) { if(f[v]==v) return v; else { f[v]=getf(f[v]); return f[v]; } } int main() { while(~scanf("%d%d",&n,&m)) { int a,b,minn,i,j,t1,t2; for(i=0; i<m; i++) scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].s); sort(q,q+m,cmp); scanf("%d",&k); while(k--) { scanf("%d%d",&a,&b); minn=INF; for(i=0; i<m; i++) { init(); for(j=i; j<m; j++) { t1=getf(q[j].x); t2=getf(q[j].y); if(t1!=t2) f[t2]=t1; if(getf(a)==getf(b)) { if(minn>q[j].s-q[i].s) minn=q[j].s-q[i].s; break; } } } if(minn==INF) printf("-1\n"); else printf("%d\n",minn); } } return 0; }