find the most comfortable road HDU - 1598

XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input输入包括多个测试实例,每个实例包括:
第一行有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 2

Sample Output

1
0
题解:二分差值,再依次枚举最小边,完成建图,然后SPFA判断从起点能不能到终点。
题解:还可以用并查集来做,也是枚举最小边,然后逐渐加边,用并查集管理,当起点和终点在并查集中时,就得到一个舒适度,然后更新答案就行。
  1 #include<queue>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 using namespace std;
  7 
  8 const int maxm=205;
  9 const int INF=1e9+7;
 10 const int maxn=1005;
 11 
 12 struct node{
 13     int to,next,va;
 14 }e[2*maxn];
 15 
 16 struct nooe{
 17     int a,b,c;
 18     bool operator<(const nooe& i)const{
 19         return c<i.c;
 20     }
 21 }p[2*maxn];
 22 
 23 int n,m,tot;
 24 int d[maxm],head[maxm];
 25 bool use1[maxm],use[maxm]; 
 26 
 27 void Inite(){
 28     tot=0;
 29     memset(use1,0,sizeof(use1));
 30     memset(head,-1,sizeof(head));
 31 }
 32 
 33 void addedge(int u,int v,int w){
 34     e[tot].to=v;
 35     e[tot].va=w;
 36     e[tot].next=head[u];
 37     head[u]=tot++;
 38 }
 39 
 40 bool SPFA(int sta,int end){
 41     queue<int> q;
 42     q.push(sta);
 43     for(int i=1;i<=n;i++) d[i]=INF;
 44     d[sta]=0;
 45     while(!q.empty()){
 46         int v=q.front();
 47         q.pop();
 48         use[v]=0;
 49         for(int i=head[v];i!=-1;i=e[i].next){
 50             int u=e[i].to;
 51             if(d[v]+e[i].va<d[u]){
 52                 d[u]=d[v]+e[i].va;
 53                 if(!use[u]){
 54                     use[u]=1;
 55                     q.push(u);
 56                 }
 57             }
 58         }
 59     }
 60     if(d[end]==INF) return false;
 61     else return true;
 62 } 
 63 
 64 void Solve(int sta,int end){
 65     int l=p[1].c-p[1].c;
 66     int r=p[m].c-p[1].c;
 67     int ans=INF;
 68     
 69     while(l<=r){
 70         int mid=(l+r)>>1;
 71         
 72         bool flag=0;
 73         for(int i=1;i<=m;i++){
 74             Inite();
 75             for(int j=i;j<=m;j++){ 
 76                 if(p[j].c>p[i].c+mid) break;
 77                 addedge(p[j].a,p[j].b,p[j].c);
 78                 addedge(p[j].b,p[j].a,p[j].c);
 79             }
 80             if(SPFA(sta,end)){ flag=1; break; }
 81         }
 82         
 83         if(flag){ ans=min(ans,mid); r=mid-1; }
 84         else l=mid+1;
 85     }
 86     
 87     if(ans==INF) printf("-1\n");
 88     else printf("%d\n",ans);
 89 }
 90 
 91 int main()
 92 {   int q;
 93     while(~scanf("%d%d",&n,&m)){
 94         for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
 95         sort(p+1,p+m+1);
 96         scanf("%d",&q);
 97         for(int i=1;i<=q;i++){
 98             int x,y;
 99             scanf("%d%d",&x,&y);
100             Solve(x,y);
101         }
102     }
103     return 0;
104 }

 

posted @ 2017-11-14 17:23  天之道,利而不害  阅读(177)  评论(0)    收藏  举报