XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input输入包括多个测试实例,每个实例包括: 但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
第一行有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, 表示寻路的起终点。 Output每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。 Sample Input
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2Sample Output
1 0
还是自己水太浅了T T.自己一开始想的是kijstra,,某同学说会超时,,,就打消了继续进攻的念头。。
这是一道关于最小生成树的问题。当然就少不了并查集。。主要问题是,什么时候合并,怎样合并。统一合并之后肯定会有一些便被去掉。。这又该怎样处理....一团乱麻
然后又该怎样求最终结果。。。纠结了好久。
不过,大神就是厉害!!!,参考了他们的思路之后,豁然开朗,合并之后还可以恢复到原来的状态(初始化)。。这就为准备并查集了条件(很好的一个技巧)。然后一个一的比较呗,惊讶的是几层for循环竟然不会超时,不敢想啊
#include<stdio.h> #include<algorithm> using namespace std; # define INF 99999999 int n,m; int f[300]; struct note { int u,v,w; } q[2000]; void init() { for(int i=1; i<=n; i++) //在后面很重要,初始化的一个重要的条件 f[i]=i; } int cmp(note a,note b) { return a.w<b.w; //排序。。。 } int getf(int v) //kruskal模板,不需要改 { if(f[v]==v) return v; else return f[v]=getf(f[v]); } int merge(int u,int v) { int t1,t2; t1=getf(u); t2=getf(v); if(t1!=t2) { f[t2]=t1; return 1; } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { for(int j=1; j<=m; j++) { scanf("%d%d%d",&q[j].u,&q[j].v,&q[j].w); //存入数据 } sort(q+1,q+m+1,cmp); //排序 int Q,a,b; scanf("%d",&Q); while(Q--) //这才是重头戏!!! { scanf("%d%d",&a,&b); int minn=INF; //每读入一次数据要寻找一次最小值,minn要初始化 for(int i=1; i<=m; i++) //开始枚举喽 从0到m { init(); //将并查集分开(用词不太准,,)就是回到合并之前的状态。每一次枚举都要....,很重要!!! for(int j=i; j<=m; j++) //注意这里从i开始== { merge(q[j].u,q[j].v); //这是合并每一组。。然后找一组,万一找到了呢^_^ if(getf(a)==getf(b)) //如果他们的父亲相同,就是并查集里已经有了,因为从w小到大排序。不用管a是不是根,b..。 if(minn>q[j].w-q[i].w) //因为每一次枚举总有a是根的时候,此时minn最小。 { minn=q[j].w-q[i].w; //这里有一个小技巧,<span style="font-family: Arial, Helvetica, sans-serif;">q[j].w-q[i].w,因为j大,,排序......</span> break; } } } if(minn==INF)printf("-1\n"); //没有找到输出-1 else printf("%d\n",minn); } } return 0; }