本文主要是介绍并查集---NYOJ 711,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最舒适的路线
- 描述
-
异形卵潜伏在某区域的一个神经网络中。其网络共有N个神经元(编号为1,2,3,…,N),这些神经元由M条通道连接着。两个神经元之间可能有多条通道。异形卵可以在这些通道上来回游动,但在神经网络中任一条通道的游动速度必须是一定的。当然异形卵不希望从一条通道游动到另一条通道速度变化太大,否则它会很不舒服。
现在异形卵聚居在神经元S点,想游动到神经元T点。它希望选择一条游动过程中通道最大速度与最小速度比尽可能小的路线,也就是所谓最舒适的路线。
- 输入
- 第一行: K 表示有多少组测试数据。
接下来对每组测试数据:
第1行: N M
第2~M+1行: Xi Yi Vi (i=1,…..,M)
表示神经元Xi 到神经元Yi之间通道的速度必须是Vi
最后一行: S T ( S T )
【约束条件】
2≤K≤5 1<N≤500 0<M≤5000 1≤ Xi, Yi , S , T ≤N 0< Vi <30000,
Vi是整数。数据之间有一个空格。
输出 - 对于每组测试数据,输出一行:如果神经元S到神经元T没有路线,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。 样例输入
-
23 21 2 22 3 41 33 31 2 101 2 52 3 81 3
样例输出 -
25/4
-
//AC代码:
-
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int N=500+1; const int M=5000+1; const int INF=99999999; struct Node{int start,end,speed; }edge[M]; int pre[N]; bool cmp(Node x,Node y){return x.speed<y.speed; } inline void Init(int n); inline void join(int x,int y); inline int find(int x); int main(){int gcd(int a,int b);bool ok;int t,i,x,y,j,big,small,fenzi,fenmu,n,m;scanf("%d",&t);while(t--){fenzi=INF;fenmu=1;scanf("%d%d",&n,&m);for(i=0;i<m;i++)scanf("%d%d%d",&edge[i].start,&edge[i].end,&edge[i].speed);scanf("%d%d",&x,&y);sort(edge,edge+m,cmp);for(i=0;i<m;i++){ok=0;Init(n);small=edge[i].speed;for(j=i;j<m;j++){join(edge[j].start,edge[j].end);big=edge[j].speed;if(find(x)==find(y)){ok=1;break;}}if(ok){if((double)big/(double)small<(double)fenzi/(double)fenmu){fenzi=big;fenmu=small;}}}if(fenzi!=INF){if(fenzi%fenmu==0)printf("%d\n",fenzi/fenmu);else{int re=gcd(fenzi,fenmu);printf("%d/%d\n",fenzi/re,fenmu/re);}}elseprintf("IMPOSSIBLE\n");}return 0; } inline void Init(int n){for(int i=1;i<=n;i++)pre[i]=i; } inline void join(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy)pre[fx]=fy; } inline int find(int x){int r=x;while(pre[r]!=r)r=pre[r];int i=x,j;while(i!=r){j=pre[i];pre[i]=r;i=j; }return r; } int gcd(int a,int b){if(b==0)return a;else return gcd(b,a%b); }
- 第一行: K 表示有多少组测试数据。
这篇关于并查集---NYOJ 711的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!