题目链接
题意
现有一个传动系统,包含了N个组合齿轮和M个链条。每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y。
即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈。传动比为正表示若编号为u的齿轮顺时针转动,则编号为v的齿轮也顺时针转动。传动比为负表示若编号为u的齿轮顺时针转动,则编号为v 的齿轮会逆时针转动。若不同链条的传动比不相容,则有些齿轮无法转动。我们希望知道,系统中的这N个组合齿轮能否同时转动。
思路
- 对没有转动的齿轮dfs,设置相应的速率rate[i],若搜索到已转动的齿轮,判断速度是否相同
参考代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
int v,x,y;
node(int _v,int _x,int _y)
{
v=_v;
x=_x;
y=_y;
}
};
vector<node>aa[1010];
int vis[1010];
double rate[1010];
int fl=0;
void dfs(int x, int fa)
{
for(int i=0; i<aa[x].size(); i++)
{
if(vis[aa[x][i].v]==0)
{
vis[aa[x][i].v]=1;
rate[aa[x][i].v]=rate[x]*aa[x][i].y/aa[x][i].x;
dfs(aa[x][i].v,x);
}
else
{
if(rate[x]*aa[x][i].y/aa[x][i].x-rate[aa[x][i].v]>0.0000001)
{
fl=1;
return;
}
}
}
}
int main()
{
int t;
cin>>t;
int ca=0;
while(t--)
{
for(int i=1;i<=n;++i) aa[i].clear();
memset(vis,0,sizeof(vis));
fl=0;
cin>>n>>m;
int u,v,x,y;
for(int i=0; i<m; i++)
{
cin>>u>>v>>x>>y;
aa[u].push_back(node(v,x,y));
aa[v].push_back(node(u,y,x));
}
for(int i=1; i<=n; i++)
{
if(vis[i]==0)
{
vis[i]=1;
rate[i]=100.0;
dfs(i,0);
}
if(fl==1)
break;
}
if(fl==1)
cout<<"Case #"<<++ca<<": No"<<endl;
else
cout<<"Case #"<<++ca<<": Yes"<<endl;
}
}