POJ 1655
模板题
代码:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=20000+100;
vector<int>G[maxn];
int son[maxn];
int num,ans;
bool vis[maxn];
int n;
inline void DFS(int u){
int len=G[u].size();
vis[u]=true;
son[u]=1;
int maxson=0;
for(int i=0;i<len;i++){
int v=G[u][i];
if(vis[v]) continue;
DFS(v);
son[u]+=son[v];
maxson=max(maxson,son[v]);
}
maxson=max(maxson,n-son[u]);
if(maxson<num || (maxson==num && u<ans)){
num=maxson;
ans=u;
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) G[i].clear(),vis[i]=false;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
num=ans=INF;
DFS(1);
printf("%d %d\n",ans,num);
}
}
POJ 3107
也是模板题,好像卡用 vector 存图(反正我用 vector T了)
代码:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=50000+100;
struct Edge{
int to,next;
}edge[maxn<<1];
int head[maxn],edgenum;
int son[maxn];
int ans[maxn],tot,num;
bool vis[maxn];
int n;
inline void DFS(int u){
vis[u]=true;
son[u]=1;
int maxson=0;
for(int i=head[u];i!=-1;i=edge[i].next){
Edge e=edge[i];
int v=e.to;;
if(vis[v]) continue;
DFS(v);
son[u]+=son[v];
maxson=max(maxson,son[v]);
}
maxson=max(maxson,n-son[u]);
if(maxson<num){
num=maxson;
tot=0;
ans[tot++]=u;
}
else if(maxson==num) ans[tot++]=u;
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++) vis[i]=false,head[i]=-1;
edgenum=0;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[edgenum].to=v;
edge[edgenum].next=head[u];
head[u]=edgenum++;
edge[edgenum].to=u;
edge[edgenum].next=head[v];
head[v]=edgenum++;
}
num=INF;
DFS(1);
sort(ans,ans+tot);
tot--;
for(int i=0;i<=tot;i++) printf("%d%c",ans[i],i==tot?'\n':' ');
}
}