P1475 控制公司
阿新 • • 發佈:2018-11-27
這是一道比較易懂的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啦~