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 }

浙公网安备 33010602011771号