《算法周练4》A题解

[SDOI2016]齿轮

https://ac.nowcoder.com/acm/contest/5505/A

题意:问的是给定比例的齿轮能否旋转.
思路:首先,如果这个齿轮不成环,那么肯定可以通过相邻的齿轮转动.
所以我们需要的是判断成环的时候是否也能够转动.
首先,我们dfs时进行赋值,通过这个比例来赋值,让起始点为1.0即可.
然后当我们第二次来到这个点时,它已经判断下成环后重新赋的值和之前赋的值是否一样,一样就说明可以一起旋转.
不一样说明无法旋转.
实现上,我们成环后判断的只是起始点,然后就不再继续dfs,保证了不会死循环.

Code:
double eps = 1e-6;
struct Node
{
    int to;
    double x,y;
};
vector<Node> G[1005];
double w[1005];
int vis[1005],f;
void dfs(int u,int fa)
{
    vis[u] = 1;
    for(int i=0;i<G[u].size();++i)
    {
        int y = G[u][i].to;
        double x = G[u][i].x,yy = G[u][i].y;
        if(y == fa) continue;
        if(!vis[y]) 
        {
            w[y] = w[u]*yy/x;
            dfs(y,fa);
        }
        else//成环后遍历到
        {
            double cal = w[u]*yy/x;
            if(abs(w[y]-cal) > eps)
            {
                f = 1;
                return ;
            }
        }
    }
}
int main()
{
    int t,ca = 0;sd(t);
    while(t--)
    {
        int n,m;sdd(n,m);
        for(int i=1;i<=n;++i) G[i].clear();
        while(m--)
        {
            int u,v;
            double x,y;
            cin >> u >> v >> x >> y;
            G[u].push_back(Node{v,x,y});
            G[v].push_back(Node{u,y,x});
        }
        f = 0;
        met0(vis);
        for(int i=1;i<=n;++i)
        {
            if(f) break;
            if(!vis[i])
            {
                w[i] = 1.0;
                dfs(i,0);
            }
        }
        if(f) printf("Case #%d: No\n",++ca);
        else printf("Case #%d: Yes\n",++ca);
    }
    system("pause");
    return 0;
}
全部评论
大佬能解释一下赋值这部分吗, 有点懵😵
点赞 回复 分享
发布于 2022-03-31 11:02

相关推荐

LuvSran:是人我吃。老师就是学校呆久了,就业方面啥都不懂,还自以为是为了我们就业好。我学校就一破双非,计科入行率10%都没有,某老师还天天点名,说是出勤率抬头率前排率高了,华为什么的大厂就会来,我们就是不好好上课才没有厂来招。太搞笑了
点赞 评论 收藏
分享
09-17 19:25
已编辑
太原理工大学 游戏测试
叁六玖:公司名发我,我要这个HR带我打瓦
我的秋招日记
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务