【bzoj4602】[Sdoi2016]齿轮

dfs,连边,边权为比值,赋值搜索,遇到矛盾时退出

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
 
typedef long long LL;
typedef double DB;
 
#define eps 1e-8
#define M 10010
#define N 1010
 
struct edge
{
    int to,next;
    DB a;
}e[M<<1];
int head[M<<1];
int cnt;
 
int T,n,m;
int yjy;
 
int x,y,u,v;
int p[N<<1];
 
DB f[M<<1];
 
void link(int u,int v,DB x)
{
    e[++cnt]=(edge){v,head[u],x};
    head[u]=cnt;
}
 
int dfs(int x)
{
    p[x]=1;
    for (int i=head[x];i!=-1;i=e[i].next)
    {
        int t=e[i].to;
        if (p[t]==0)
        {
            f[t]=f[x]*e[i].a;
            if (!dfs(t))
                return 0;
        }
        else if ((f[x]*e[i].a-f[t])>eps)
            return 0;
    }
    return 1;
}
 
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        cnt=0;
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
            head[i]=-1,p[i]=0,f[i]=0;
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d%d",&u,&v,&x,&y);
            link(v,u,1.0*x/y);          
            link(u,v,1.0*y/x);
        }
        bool flag=false;
        for (int i=1;i<=n;i++)
            if (!p[i])
            {
                f[i]=1.0;
                if (!dfs(i))
                {
                    flag=true;
                    break ;
                }
            }
        printf("Case #%d: ",++yjy);
        if (!flag)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

  

posted @ 2016-05-31 20:37  Yangjiyuan  阅读(213)  评论(1编辑  收藏  举报