find the most comfortable road |
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 244 Accepted Submission(s): 115 |
Problem Description
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 |
Author
ailyanlu
|
Source
HDU 2007-Spring Programming Contest - Warm Up (1)
|
Recommend
8600
|
/* dfs爆了一发,莫名地爆栈了。桑心 ....0.0.... 接着用迪里斯卡尔暴力搞了一发。水过 */ #include<bits/stdc++.h> #define N 20005 #define INF 0x3f3f3f3f using namespace std; struct node { int u,v,val; node(){} node(int a,int b,int c) { u=a; v=b; val=c; } }; bool comp(node a,node b) { return a.val<b.val; } int n,m,t; vector<node>edge; int x,y,val; int fis,en; int bin[205]; int findx(int x) { while(x!=bin[x]) x=bin[x]; return x; } int judge(int x,int y) { int fx=findx(x); int fy=findx(y); if(fx!=fy) { bin[fx]=fy; return 1; } return 0; } void inti() { for(int i=0;i<=n;i++) bin[i]=i; } int main() { //freopen("C:\Users\acer\Desktop\in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { edge.clear(); for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&val); edge.push_back(node(x,y,val)); } sort(edge.begin(),edge.end(),comp);//按照边的全脂排序 scanf("%d",&t); while(t--) { int minn=INF; scanf("%d%d",&fis,&en); for(int i=0;i<m;i++) { inti(); for(int j=i;j<m;j++) { judge(edge[j].u,edge[j].v); if(findx(fis)==findx(en)) { minn=min(minn,edge[j].val-edge[i].val); break; } } } if(minn==INF) puts("-1"); else printf("%d ",minn); } } return 0; } /* dfs水了一发竟然爆了 #include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int n,m,t; struct node { int v,val; node(){} node(int a,int b) { v=a; val=b; } }; vector<node>edge[205]; int x,y,val; void inti() { for(int i=0;i<=n;i++) { edge[i].clear(); } } int fis,en; int maxn=-1; int minn=INF; int f=0; int cur=INF; void dfs(int v,int u) { if(v==en) { //cout<<"maxn="<<maxn<<" minn="<<minn<<endl; //cout<<"maxn-minn="<<maxn-minn<<endl; cur=min(maxn-minn,cur); return ; } for(int i=0;i<edge[v].size();i++) { int nex=edge[v][i].v; if(nex==u) continue; minn=min(minn,edge[v][i].val); maxn=max(maxn,edge[v][i].val); dfs(nex,v); maxn=-1; minn=INF; } return; } int main() { //freopen("C:\Users\acer\Desktop\in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { inti(); for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&val); //构图 edge[x].push_back(node(y,val)); edge[y].push_back(node(x,val)); } scanf("%d",&t); for(int i=0;i<t;i++) { maxn=-1; minn=INF; f=0; scanf("%d%d",&fis,&en); cur=INF; dfs(fis,-1); if(cur!=INF) printf("%d ",cur); else puts("-1"); } } return 0; } */