现有一个传动系统,包含了N个组合齿轮和M个链条。每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x
: y。即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈。传动比为正表示若编号
为u的齿轮顺时针转动,则编号为v的齿轮也顺时针转动。传动比为负表示若编号为u的齿轮顺时针转动,则编号为v
的齿轮会逆时针转动。若不同链条的传动比不相容,则有些齿轮无法转动。我们希望知道,系统中的这N个组合齿
轮能否同时转动。
标签:
#include<stdio.h> #include<iostream> using namespace std; const int N=1005; const int M=10005; #define eps 1e-8 int T,n,m,i,x,y,u,v,ok,Case,p[N]; int tot,head[N],Next[M<<1],to[M<<1]; double a[M<<1],f[N]; void add(int u,int v,double x) { tot++; to[tot]=v; a[tot]=x; Next[tot]=head[u]; head[u]=tot; } bool dfs(int x) { int i; p[x]=1; for(i=head[x];i!=-1;i=Next[i]) { int y=to[i]; if(p[y]==0) { f[y]=f[x]*a[i]; if(dfs(y)==0) return 0; } else if((f[x]*a[i]-f[y])>eps) return 0; } return 1; } int main() { scanf("%d",&T); Case=0; while(T--) { scanf("%d%d",&n,&m); tot=0; for(i=1;i<=n;i++) head[i]=-1,p[i]=0,f[i]=0; for(i=1;i<=m;i++) { scanf("%d%d%d%d",&u,&v,&x,&y); add(u,v,1.0*x/y); add(v,u,1.0*y/x); } ok=0; for(i=1;i<=n;i++) if(p[i]==0) { f[i]=1.0; if(dfs(i)==0) { ok=1; break; } } Case++; printf("Case #%d: ",Case); if(ok==0) printf("Yes\n");else printf("No\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/lwq12138/p/5514451.html