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条高速路和时间,又给出Q组数据,每组数据是两个城市号,求这两个城市连通时高速路速度最小差,若是无法连通,则输出-1。
题解:先输入n和m以及m组数据,将速度从小到大排序,然后循环输入Q组数据,在循环中使用并查集,再使用两个循环,第一层循环控制最小边,第二层控制的最大边,if判断x1,y1两城市是否相互连通,是的话就判断是否速度差最小。最后如果minn还是无穷大则没有连通,输出-1,否则输出最小速度差。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; struct node { int u,v; int w; }e[1100]; int n,m,Q,x1,y1; int f[205],sum,t,minn; int cmp(node A,node B) { return A.w<B.w; } int getf(int v) { if(f[v]==v) return v; else { f[v]=getf(f[v]); return f[v]; } } void merg(int v,int u) { int t1,t2; t1=getf(v); t2=getf(u); if(t1!=t2) { f[t2]=t1; } return ; } void init() { for(int i=1;i<=n;i++) f[i]=i; } int main() { while(~scanf("%d%d",&n,&m)) { int i,j; memset(f,0,sizeof(f)); for(i=0;i<m;i++) { scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); } sort(e,e+m,cmp); scanf("%d",&Q); for(int p=0;p<Q;p++) { minn=inf; scanf("%d%d",&x1,&y1); for(i=0;i<m;i++) //控制最小边 { init(); //对否f[i]赋值 for(j=i;j<m;j++) //控制最大边 { merg(e[j].u,e[j].v); if(getf(x1)==getf(y1)) //如果x1和y1能连通—-进入 { minn=min(minn,e[j].w-e[i].w); //得出最小差 break; } } } if(minn==inf) //如果不能到达输出-1 printf("-1\n"); else printf("%d\n",minn); } } }