有根树的同构vijos

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=55;
vector g[110][maxn];
int s[110][110],l,r,q[110],in[110][maxn],cnt[110],num[110][110]
,vis[maxn],d[110][110],k,n,t[110][110];
void dfs(int x,int y){
 t[y][x]=1;
 for(int i=0;i   dfs(g[y][x][i],y);
 }
 for(int i=0;i   t[y][x]+=t[y][g[y][x][i]];
 }
}
int main(){
 memset(d,-1,sizeof(d));
 scanf("%d%d",&k,&n);
 int u,v;
 for(int i=1;i<=k;i++){
  for(int j=1;j    scanf("%d%d",&u,&v);
   g[i][u].push_back(v);
   in[i][v]++;
  }
  for(int j=1;j<=n;j++){
   if(in[i][j]==0){
    dfs(j,i);
    break;
   }
  }
 }
 //cout<<1<  int cur;
 memset(cnt,0,sizeof(cnt));
 for(int i=1;i<=k;i++){
  l=r=0;
  for(int j=1;j<=n;j++){
   if(in[i][j]==0){
    num[i][j]=1;
    s[i][++cnt[i]]=1;
    q[++r]=j;
    break;
   }
  }
  //cout<<"i: "<   while(l    int now=q[++l];
   for(int j=0;j     //cout<<"j: "<     in[i][g[i][now][j]]--;
    //cout<<"j: "<<1<     if(in[i][g[i][now][j]]==0){
     q[++r]=g[i][now][j];
     //cout<<2<      num[i][g[i][now][j]]=num[i][now]+1;
     //cout<<3<      s[i][++cnt[i]]=num[i][g[i][now][j]]*t[i][now];
     //cout<<4<     }
   }
  }
 }
 //cout<<2<  for(int i=1;i<=n;i++){
  for(int j=1;j<=n;j++){
   int f=0;
   if(i==j||d[i][j]!=-1) continue;
   if(cnt[i]!=cnt[j]){
    d[i][j]=0; continue;
   }
   for(int k=1;k<=cnt[i];k++){
    if(s[i][k]!=s[j][k]){
     d[i][j]=false; f=true; break;
    }
   }
   if(!f){
    d[i][j]=true;
   }
  }
 }
//cout<<3<  int ans=0;
 /*for(int i=1;i<=k;i++){
  for(int j=1;j<=cnt[i];j++){
   cout<   }
 }*/
 /*for(int i=1;i<=k;i++){
  cout<<"i: "<   for(int j=1;j<=n;j++)
   cout<   cout<  }*/
 for(int i=1;i<=k;i++){
  sort(t[i]+1,t[i]+1+cnt[i]);
 }
 for(int i=1;i<=k;i++){
  if(vis[i]) continue;
  cout<   for(int j=1;j<=n;j++){
   if(i==j) continue;
   if(vis[j]) continue;
   if(d[i][j]){
    cout<<"="<     vis[j]=true;
   } 
  }
  cout<  }
 return 0;
}

你可能感兴趣的:(有根树的同构vijos)