这是一道比较易懂的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啦~