并查集---NYOJ 711

2024-02-04 00:08
文章标签 查集 nyoj 711

本文主要是介绍并查集---NYOJ 711,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最舒适的路线

时间限制: 5000 ms  |  内存限制: 65535 KB
难度: 5
描述

异形卵潜伏在某区域的一个神经网络中。其网络共有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);
}


这篇关于并查集---NYOJ 711的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675838

相关文章

poj 1182 并查集 食物链类

题意: 有n只动物,分别编号1....n。所有动物都属于A,B,C中的一种,已知A吃B,B吃C,C吃A。 按顺序给出下面两种共K条信息: 1. x 和 y 属于同一类。 2. x 吃 y 。 然而这些信息可能会出错,有可能有的信息和之前给出的信息矛盾,也有的信息可能给出的 x 和 y 不在n的范围内。 求k条信息中有多少条是不正确的。 解析: 对于每只动物,创建3个元素 i

POJ1988带权并查集

M u v 将u所在的堆移动到v所在的堆的上面 C u 求u的下面有多少块 带权并查集 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;i

POJ1703带权并查集

D: u v  u与v在不同的集合 A: u v  查询u与v的关系 1)压缩路径过程        fu->root   0  1  u-fu 0                 0  1   1                 1  0 2)合并过程 fu->fv      u->fu   0 1   v->fv 0            1 0 1            0

nyoj 288 士兵杀敌(五)

一道插线问线离线版的题  复杂度O(n); 代码如下: #include<stdio.h>#include<string.h>const int M = 1000003;const int mod=10003;int num[M];int main(){int n,c,q;scanf("%d%d%d",&n,&c,&q);while(c--){int a,b,x;scan

nyoj 1037 Postscript of Tian Ji racing

一道卡贪心的题。 也算一道改编题。 此题的解法推荐为二分图的最大匹配。 首先将输入数据转换一下,然后将满足题意的一组牌建立条边,最终边的覆盖数即为 LN 最后可得的分数。 然后求出最大匹配即可。 代码如下: #include<stdio.h>#include<string.h>char card[30][5];char s[5];int map[30][30];

nyoj 1002 Trucking

同样一道改编题。 只要把题意理解了好。 简单的二分加最短路。 只要二分高度, 然后求最短路,输出满足题意的即可。 代码如下: (最短路用spfa 时间效率高) #include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <queue>using namespace st

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

nyoj 695 Judging Filling Problems

一道强大的模拟题。。。 只要学会<string>类的运用即可。。。 注意: 1、细节的处理。 2、问题的分情况讨论。。 附上代码: 有好对缀余的地方,希望大神前来更新。 #include<stdio.h>#include<string.h>#include<string>#include<iostream>using namespace std;int num[1000