[SDOI2016]齿轮

题意:

分析:

一开始算比例的时候,怕用浮点数会不准确,结果就是用浮点数。
然后,判断两个浮点数是否相等时,我直接比较,结果就错了。要用误差范围。但记得以前用这个好像还错了,然后就一直直接比较。
直接搜索判断即可。

代码:

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const double eps=1e-6;
const int N=1010;
bool vis[N],f;
double d[N];
struct node
{
    int u,x,y;
};
vector<node>p[N];
bool check(double x,double y)
{
    return abs(x-y)<=eps;
}
void dfs(int v)
{
    for(int i=0;i<p[v].size();i++)
    {
        node now=p[v][i];
        if(vis[now.u])//检验是否矛盾
        {
            double t=d[v]*now.y/now.x;
            if(!check(t,d[now.u]))
            {
                f=0;
                return;
            }
        }
        else
        {
            double t=d[v]*now.y/now.x;
            d[now.u]=t;
            vis[now.u]=1;
            dfs(now.u);
            if(!f) return;
        }
    }
}
int main()
{
    int t,n,m,u,v,x,y,cas=0;
    scanf("%d",&t);
    while(t--)
    {
        f=1;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            p[i].clear();
            d[i]=0;
            vis[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d%d",&u,&v,&x,&y);
            p[u].pb(node{v,x,y});
            p[v].pb(node{u,y,x});
        }
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                d[i]=1;
                dfs(i);
                if(!f) break;
            }
        }
        printf("Case #%d:",++cas);
        if(f)
            printf(" Yes
");
        else
            printf(" No
");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/12803153.html