4602: [Sdoi2016]齿轮

来源:互联网 发布:java如何编译 编辑:程序博客网 时间:2024/06/09 14:37

4602: [Sdoi2016]齿轮

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 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

Sample Output

Case #1: Yes
Case #2: No

HINT

Source

By AHdoc命题 鸣谢Loi_DQS上传

[Submit][Status][Discuss]



很容易想到直接模拟此题= =

任取一个齿轮假设它一开始转一圈,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
原创粉丝点击