死都过不了啊,一个点re,一个点wa

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstddef>
using namespace std;
int map[305][305]={-1},fa[305]={-1},num[305]={0},n,p,ans=0,notok[305]={0},vis[305]={0},deep[350],mx=0;
vector <int> son[305],depth[350];

void tran(int x,int y)
{
for(int i=1;i<=n;++i)
if(map[x][i]&&i!=y)
{
son[x].push_back(i);
deep[i]=deep[x]+1;
depth[deep[i]].push_back(i);
if(deep[i]>mx) mx=deep[i];
fa[i]=x;
tran(i,x);
}
return;
}

void pre(int x)
{
if(fa[x]==-1) return;
num[fa[x]]+=num[x];
}

inline void dfs(int x)
{
notok[x]=1;
if(!son[x].size()) return;
int mx1=0,w=0;
for(size_t i=0;i<son[x].size();++i)
if(mx1<num[son[x][i]])
{
mx1=num[son[x][i]];
w=i;
}
size_t i=0;
for(;i<son[x].size();++i) if(i!=w) break;
for(size_t j=i+1;j<son[x].size();++j)
{
if(j==w) continue;
notok[son[x][j]]=1;
for(size_t k=0;k<son[son[x][j]].size();++k)
son[son[x][i]].push_back(son[son[x][j]][k]);
}
dfs(son[x][i]);
return;

}

int main()
{
cin>>n>>p;
for(int i=1;i<=p;++i)
{
int x,y;
cin>>x>>y;
map[x][y]=map[y][x]=1;
}
deep[1]=0;
depth[0].push_back(1);
tran(1,-1);
/* for(int i=1;i<=n;++i)
{
cout<<i<<endl;
for(int j=0;j<son[i].size();++j) cout<<son[i][j]<<' ';
cout<<endl;
}
for(int i=1;i<=n;++i)
cout<<i<<' '<<deep[i]<<endl;
for(int i=0;i<=mx;++i)
{
cout<<i<<endl;
for(int j=0;j<depth[i].size();j++)
cout<<depth[i][j]<<' ';
cout<<endl;
}*/
for(int i=1;i<=n;++i) num[i]=1;
for(int d=mx;d>=0;d--)
for(int i=1;i<=n;++i)
if(deep[i]==d) pre(i);
/* for(int i=1;i<=n;++i) cout<<i<<' '<<num[i]<<endl;*/
if(son[1].size()==1)
{
printf("1\n");
return 0;
}
else
{
dfs(1);
for(int i=1;i<=n;++i) if(notok[i]) ans++;
cout<<ans<<endl;
return 0;
}
}

1 条评论

  • @ 2016-11-16 09:45:17

    大神帮忙看看

  • 1

信息

ID
1101
难度
6
分类
搜索 | 搜索与剪枝 点击显示
标签
递交数
3478
已通过
890
通过率
26%
被复制
15
上传者