4602: [Sdoi2016]齿轮
来源:互联网 发布:java如何编译 编辑:程序博客网 时间:2024/06/09 14:37
4602: [Sdoi2016]齿轮
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 422 Solved: 221
[Submit][Status][Discuss]
Description
现有一个传动系统,包含了N个组合齿轮和M个链条。每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x
: y。即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈。传动比为正表示若编号
为u的齿轮顺时针转动,则编号为v的齿轮也顺时针转动。传动比为负表示若编号为u的齿轮顺时针转动,则编号为v
的齿轮会逆时针转动。若不同链条的传动比不相容,则有些齿轮无法转动。我们希望知道,系统中的这N个组合齿
轮能否同时转动。
Input
有多组数据,第一行给定整数T,表示总的数据组数,之后依次给出T组数据。每一组数据的第一行给定整数N和
M,表示齿轮总数和链条总数。之后有M行,依次描述了每一个链条,其中每一行给定四个整数u,v,x和y,表示
只考虑这一组联动关系的情况下,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈。请注意,x为正整数,而y为
非零整数,但是y有可能为负数。
T<=32,N<=1000,M<=10000且x与y的绝对值均不超过100
Output
输出T行,对应每一组数据。首先应该输出标识这是第几组数据,参见样例输出。之后输出判定结果,如果N个组合
齿轮可以同时正常运行,则输出Yes,否则输出No。
Sample Input
2
3 3
1 2 3 5
2 3 5 -7
1 3 3 -7
3 3
1 2 3 5
2 3 5 -7
1 3 3 7
3 3
1 2 3 5
2 3 5 -7
1 3 3 -7
3 3
1 2 3 5
2 3 5 -7
1 3 3 7
Sample Output
Case #1: Yes
Case #2: No
Case #2: No
HINT
Source
By AHdoc命题 鸣谢Loi_DQS上传
很容易想到直接模拟此题= =
任取一个齿轮假设它一开始转一圈,BFS,碰到齿轮把圈数按比例乘过去,转向看是否取反
很容易就能判断出是否可行,O(n)
但是这个算法有个很明显的问题,,,如果每两个齿轮的圈数都是1:100呢。。这根本存不下= =
碰到很大的数,不需要明确知道它的值,但是要拿它比大小
取对数是个不错的方法
乘除对应成对数的加减运算即可
#include<iostream>#include<cmath>#include<cstdio>#include<algorithm>#include<vector>#include<queue>using namespace std;typedef double DB;const int maxn = 1E5 + 10;const DB eps = 1E-8;struct E{int to,typ; DB g; E(){}E(int to,int typ,DB g): to(to),typ(typ),g(g){}};int n,m,T,typ[maxn];DB c[maxn];vector <E> v[maxn];queue <int> Q;bool fcmp(const DB &x,const DB &y) {return fabs(x - y) <= eps;}bool BFS(int x){while (!Q.empty()) Q.pop(); Q.push(x);typ[x] = 0; c[x] = 0; while (!Q.empty()){int k = Q.front(); Q.pop();for (int i = 0; i < v[k].size(); i++){E e = v[k][i];if (typ[e.to] != -1){if ((typ[k]^e.typ) != typ[e.to]) return 0;if (!fcmp(c[k] - c[e.to],e.g)) return 0;}else{typ[e.to] = (typ[k]^e.typ);c[e.to] = c[k] - e.g;Q.push(e.to);}}}return 1;}int main(){#ifdef DMCfreopen("DMC.txt","r",stdin);#endifcin >> T;for (int I = 1; I <= T; I++){bool pass = 1;scanf("%d%d",&n,&m);for (int i = 1; i <= n; i++) typ[i] = -1,v[i].clear();while (m--){int x,y,a,b,t;scanf("%d%d%d%d",&x,&y,&a,&b);if (b < 0) t = 1,b = -b; else t = 0;v[x].push_back(E(y,t,log((DB)(a)/(DB)(b))));v[y].push_back(E(x,t,log((DB)(b)/(DB)(a))));}for (int i = 1; i <= n; i++)if (typ[i] == -1){pass = BFS(i);if (!pass) break;}if (pass) printf("Case #%d: Yes\n",I);else printf("Case #%d: No\n",I);}return 0;}
变量名写错狂WA不止。。一道模拟写成这样也是好醉。。。。。。。。
0 0
- bzoj 4602: [Sdoi2016]齿轮
- BZOJ 4602 [Sdoi2016]齿轮
- 4602: [Sdoi2016]齿轮
- [dfs] BZOJ 4602 [Sdoi2016]齿轮
- BZOJ4602 [Sdoi2016]齿轮
- 【bzoj4602】【SDOI2016】【齿轮】【dfs】
- 【bzoj4602】[Sdoi2016]齿轮 dfs
- BZOJ4602: [Sdoi2016]齿轮
- bzoj4602 [Sdoi2016]齿轮
- bzoj4602: [Sdoi2016]齿轮
- bzoj 4602: [Sdoi2016]齿轮(加权并查集)
- BZOJ[4602] [Sdoi2016]齿轮 加权并查集
- [BZOJ4602][Sdoi2016]齿轮(加权并查集+分解质因数)
- [BZOJ4602][Sdoi2016]齿轮(加权并查集)
- [SDOI2016] BZOJ4602 齿轮-dfs-带权并查集-数论逆元-质因数分解
- 数齿轮
- 齿轮基础
- 【搜索】齿轮
- vim简化ctags+taglist安装
- 主从复制配置
- 微信播放视频花屏解决办法
- storm的单节点安装以及简单操作
- Mybatisd的逆向工程
- 4602: [Sdoi2016]齿轮
- IE不兼容placeholder的解决方案
- Win下必备神器之Cmder
- 由于网卡单队列导致的CPU高
- PHP cookie加密
- 简单c程序
- HTML5—浏览器支持问题
- 【MYSQL】数据类型强制转换导致数据超预期
- linux下安装配置DBI,perl连接mysql