• 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
    ",cas);
            else printf("Case #%d: Yes
    ",cas);
        }
    }
  • 相关阅读:
    前端-html/css
    数据结构-python
    接口测试-并发处理
    接口测试-高级运用
    接口测试-模拟网络请求
    接口测试-基础
    Jenkins-基础
    appium安装及环境搭建、入门
    Week12-unittest单元测试
    Redis在windows下安装与配置
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5664700.html
Copyright © 2020-2023  润新知