题目描述

给出一张n个点m条边的有向图,每条边 (u,v,x,y) 描述了 u 的点权乘 x 等于 v 的点权乘 y (点权可以为负)。问:是否存在满足条件的图。

输入

有多组数据,第一行给定整数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

输出

输出T行,对应每一组数据。首先应该输出标识这是第几组数据,参见样例输出。之后输出判定结果,如果N个组合
齿轮可以同时正常运行,则输出Yes,否则输出No。

样例输入

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

样例输出

Case #1: Yes
Case #2: No


题解

BFS

显然固定一个点,通过条件判断出其它点是否是它的固定倍数即可。添加双向边,维护每个点是某个点的多少倍,BFS验证。

但是有一个问题:倍数关系是指数级的,因此需要取对数。

但是有一个问题:边权有负数,因此需要维护符号和绝对值的对数。

但是有一个问题:有精度误差,因此需要设eps为$10^{-6}$。

时间复杂度$O(T(n+m))$

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#define N 1010
#define M 20010
using namespace std;
queue<int> q;
int head[N] , to[M] , vp[M] , next[M] , cnt , vis[N] , flag[N];
double val[M] , dis[N];
void add(int x , int y , double z , int p)
{
to[++cnt] = y , val[cnt] = z , vp[cnt] = p , next[cnt] = head[x] , head[x] = cnt;
}
bool judge(int p)
{
int i , x;
while(!q.empty()) q.pop();
vis[p] = 1 , q.push(p);
while(!q.empty())
{
x = q.front() , q.pop();
for(i = head[x] ; i ; i = next[i])
{
if(!vis[to[i]]) vis[to[i]] = 1 , flag[to[i]] = flag[x] ^ vp[i] , dis[to[i]] = dis[x] + val[i] , q.push(to[i]);
else if(flag[to[i]] != (flag[x] ^ vp[i]) || fabs(dis[to[i]] - dis[x] - val[i]) > 1e-6) return 0;
}
}
return 1;
}
int main()
{
int T , Case;
scanf("%d" , &T);
for(Case = 1 ; Case <= T ; Case ++ )
{
memset(head , 0 , sizeof(head)) , memset(vis , 0 , sizeof(vis)) , cnt = 0;
int n , m , x , y , i , a , b;
scanf("%d%d" , &n , &m);
while(m -- )
{
scanf("%d%d%d%d" , &x , &y , &a , &b);
if(b > 0) add(x , y , log(b) - log(a) , 0) , add(y , x , log(a) - log(b) , 0);
else add(x , y , log(-b) - log(a) , 1) , add(y , x , log(a) - log(-b) , 1);
}
for(i = 1 ; i <= n ; i ++ )
if(!vis[i])
if(!judge(i))
break;
printf("Case #%d: " , Case);
if(i > n) puts("Yes");
else puts("No");
}
return 0;
}

最新文章

  1. Docker中部署Kubernetes
  2. DES算法
  3. 24SQL
  4. jira与mysql的配合搭建调整
  5. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)
  6. GetProperties(BindingFlags)说明
  7. thinkphp 文件上传
  8. [转]内嵌WORD/OFFICE的WINFORM程序——DSOFRAMER使用小结
  9. Windows Azure 新上线网络相关服务
  10. js 计时器小练-20160601
  11. top_channel_args.go
  12. python学习日记(python2/3区别补充,is / id/ encode str,bytes)
  13. OpenOCD-JTAG调试
  14. python---issubclass/type/isinstance/ 反射(内置函数getattr/delattr...)
  15. 枚举类型enum详解——C语言
  16. django模板语言之Template
  17. android:碎片的概念
  18. 执行shell脚本的四种方式(转)
  19. zzuli 1875多线DP
  20. Go语言学习笔记八: 数组

热门文章

  1. LeetCode: 63. Unique Paths II(Medium)
  2. 利尔达NB-IOT模组Coap数据AT+NMGS发送时返回-513的原因
  3. git 取消commit
  4. 从golang的垃圾回收说起(上篇)
  5. CentOS下安装Tomcat环境
  6. Qt-Qml-播放视频-失败版-只有声音没有图像
  7. selenide 自动化测试进阶一: 查找元素和相关操作
  8. 第三十九篇 Python异常处理
  9. window上小而美的软件(推荐度按排名)
  10. 银行系统ps:不太完善,蟹蟹评论