zoukankan      html  css  js  c++  java
  • P1475 控制公司

      这是一道比较易懂的dfs(递归)题(虽然我一开始只得了22分)……22分代码如下:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int a[105][105];
    int x,y,z,n;
    int sum;
    int main()
    {
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(z>50)
                a[x][y]=1;
            sum=max(x,y);    其实这里就错了
        }
        for(int i=1; i<=sum; i++)
            for(int j=1; j<=sum; j++)
            {
                if(i==j)
                    continue;
                if(a[i][j]==1)
                {
                    printf("%d %d
    ",i,j);
                    for(int k=1; k<=sum; k++)
                    {
                        if(a[j][k]==1)
                        {
                            printf("%d %d
    ",i,k);
                            a[i][k]=0;
                        }
                    }
                }
            }
    return 0;
    }

      

      我我我一开始只是单纯的考虑,如果能先确定y属于x,那么再找出什么属于y就可以了。但是其实并没有那么容易实现,因为我只是找到k属于y,但是对于谁属于k,又不能继续讨论(递归很重要),所以WA。

      正确代码如下:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int n;
    int x,y,z;
    int all;
    int cnt[105],own[105],sea[105];
    int a[105][105];
    void dfs(int k)
    {
        if(sea[k]==1)
            return;  递归边界,很重要(不然就死了)
        sea[k]=1;
        for(int i=1; i<=all; i++)
        {     
    这里满足了对于k,只要i一满足条件就搜i,再找属于i的数,以此类推,最终所有own==1的,都属于k。
            cnt[i]+=a[k][i];
            if(cnt[i]>50)
            {
                own[i]=1;
                dfs(i);
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            a[x][y]=z;//x有y百分之z的股份
            all=max(x,max(all,y));
        }
        for(int i=1; i<=all; i++)
        {
            memset(sea,0,sizeof(sea));
            memset(cnt,0,sizeof(cnt));
            memset(own,0,sizeof(own));
            dfs(i);
            for(int j=1; j<=all; j++)
            {
                if(j!=i&&own[j]==1)
                    printf("%d %d
    ",i,j);
            }
        }
        return 0;
    }

      就AC啦~

  • 相关阅读:
    十大排序算法之选择排序(2)
    十大排序算法之冒泡排序(1)
    2018年年度总结
    敏捷软件开发学习笔记(四)之结构型设计模式
    敏捷软件开发学习笔记(三)之创造型设计模式
    elasticsearch+head+kibana
    闭包函数延迟绑定问题
    初谈dango的post提交csrf设置和文件上传
    浏览器的同源策略,及如可跨域
    socket并发通信的几种方式
  • 原文地址:https://www.cnblogs.com/popo-black-cat/p/10028276.html
Copyright © 2011-2022 走看看