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\n",i,j);
                for(int k=1; k<=sum; k++)
                {
                    if(a[j][k]==1)
                    {
                        printf("%d %d\n",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\n",i,j);
        }
    }
    return 0;
}

  就AC啦~

猜你喜欢

转载自www.cnblogs.com/popo-black-cat/p/10028276.html