1. 程式人生 > >P1475 控制公司

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啦~