find the most comfortable road
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7640 Accepted Submission(s): 3218
但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, 表示寻路的起终点。
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
1 0题意:先输入每两条可行路及其长度,再输入起点和终点,找出从起点到终点的可行路中的最大速度与最小速度之差思路:先将通路的权按从小到大的顺序排列,用并查集找出可行路,再找出速度之差最大的。代码:#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f
int book[10001]; int n,m,i,j,a,b,t,ans; struct node { int u,v,w; //定义结构体变量,分别表示StartCity,EndCity,speed } q[1010]; //定义结构体数组
bool cmp(node a,node b) { return a.w<b.w; //按权值的大小从小到大排序 }
int getf(int a) { if(book[a]==a) return a; else //路径压缩 { book[a]=getf(book[a]); return book[a]; } }
int merge(int a,int b) { int t1,t2; t1=getf(a); t2=getf(b); if(t1!=t2) //判断两个节点是否在同一个集合中 { book[t2]=t1;//靠左原则 return 1; } return 0; }
int main() { while(~scanf("%d%d",&n,&m)) { int f; for(i=1; i<=m; i++) scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w); sort(q+1,q+1+m,cmp); scanf("%d",&t); for(i=1; i<=t; i++) { ans=inf; scanf("%d%d",&a,&b); for(j=1; j<=m; j++) { for(f=1; f<=n; f++) book[f]=f; //每进行一次,初始化一次 for(int k=j; k<=m; k++) { merge(q[k].u,q[k].v); if(getf(a)==getf(b)) { ans=min(ans,q[k].w-q[j].w); //找出两个相邻的速度差最小的 break; } } } if(ans==inf) printf("-1\n"); else printf("%d\n",ans); } } return 0; }