今天积分赛的最后一道题目
TLE是因为自己太二了...
总体的时间复杂度是O(n^2)而不是O(n);
因为in(u,v)的函数连二分都没有写...必须TLE
orz...
真的是....
好吧,,,
下次注意子函数的复杂度
好忧伤啊...
又优化了一下...G完全可以只存反向边...orz
#include<stdio.h>
#include<vector>
#include<algorithm>
#define N 200010
using namespace std;
vector<int>L[N],G[N];
vector<int>::iterator it,itp;
int ft[N],dp[N],Q[N];
int n;
void bfs_tree(){
int i,wQ=0,pQ=0;
while(pQ<=wQ){
// printf("?");
int v=Q[pQ++];
for(it=L[v].begin();it<L[v].end();it++){
int u=*it;
if(ft[u]==-1){
ft[u]=v;
Q[++wQ]=u;
}
}
for(it=G[v].begin();it<G[v].end();it++){
int u=*it;
if(ft[u]==-1){
ft[u]=v;
Q[++wQ]=u;
dp[1]++;
}
}
}
}
void bfs_dp(){
int i,wQ=0,pQ=0;
while(pQ<=wQ){
// printf("?");
int v=Q[pQ++];
for(it=L[v].begin();it<L[v].end();it++){
int u=*it;
if(ft[u]==v){
dp[u]=dp[v]+1;
Q[++wQ]=u;
}
}
for(it=G[v].begin();it<G[v].end();it++){
int u=*it;
if(ft[u]==v){
dp[u]=dp[v]-1;
Q[++wQ]=u;
}
}
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,x,y;
for(i=1;i<=n;i++)L[i].clear(),G[i].clear();
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
// x=n;y=i;
L[x].push_back(y);
G[y].push_back(x);
}
for(i=2;i<=n;i++)ft[i]=dp[i]=-1;
Q[0]=1;ft[1]=0;dp[1]=0;
bfs_tree();
Q[0]=1;
bfs_dp();
int res=(int)1e9,fi=1;
for(i=1;i<=n;i++)if(dp[i]<res)res=dp[i];
printf("%d\n",res);
for(i=1;i<=n;i++)if(dp[i]==res){
if(fi)fi=0;else printf(" ");
printf("%d",i);
}printf("\n");
}
return 0;
}