BZOJ 4602: [Sdoi2016]齿轮 dfs

4602: [Sdoi2016]齿轮

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4602

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。
输出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

题意

题解:

直接dfs下去判断就好了呀

如果遇到和之前的答案不同的,那就是no,否则就是yes

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const double eps = 1e-6;
struct node{
    int x;
    double v;
    public: node(int X,double V):x(X),v(V){};
};
int n,m;
int vis[maxn];
double p[maxn];
vector<node>E[maxn];
void init(){
    for(int i=0;i<maxn;i++)
        E[i].clear();
    memset(vis,0,sizeof(vis));
    memset(p,0,sizeof(p));
}
int dfs(int x){
    vis[x]=1;
    for(int i=0;i<E[x].size();i++){
        int v = E[x][i].x;
        if(vis[v]){
            if(fabs(p[x]*E[x][i].v-p[v])>eps)
                return 0;
        }else{
            p[v]=p[x]*E[x][i].v;
            if(!dfs(v))return 0;
        }
    }
    return 1;
}
int main(){
    int t;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int a,b;
            double c,d;
            scanf("%d%d%lf%lf",&a,&b,&c,&d);
            E[a].push_back((node){b,c/d});
            E[b].push_back((node){a,d/c});
        }
        int flag = 1;
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                p[i]=1.0;
                flag = dfs(i);
                if(flag==0)break;
            }
        }
        if(flag==0)printf("Case #%d: No\n",cas);
        else printf("Case #%d: Yes\n",cas);
    }
}
posted @ 2016-07-12 20:02  qscqesze  阅读(373)  评论(0编辑  收藏  举报