//poj1655
#include<iostream>
#include<vector>
#include<cstring>
#include<limits.h>
// #include<Windows.h>
using namespace std;
const int nodemax=20001;
vector< vector<int> >edge;
int n;
int balmin; //最大的子连通树的大小
int all[nodemax]; //计算该节点的所有子节点的和(包括自己本身
int weindex;
int dfs(int par,int order); //par父节点 order当前节点的序号
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
edge.clear();
// vector<int> temp;
for(int i=0;i<=n;i++)
edge.push_back(vector<int>(0));
// edge.swap(vector< vector<int> >temp(n+1));
memset(all,0,sizeof(all));
balmin=INT_MAX;
weindex=-1;
int st,end;
for(int i=1;i<n;i++)
{
cin>>st>>end;
edge[st].push_back(end);
edge[end].push_back(st);
}
//for check
/*
cout<<"*********************"<<endl;
for(int i =1;i<=n;i++)
{
for(int j=0;j<edge[i].size();j++)
{
cout << edge[i][j]<< " ";
}
cout<<endl;
}
cout<<"*********************"<<endl;
*/
dfs(-1,1);
cout<<weindex<<' '<<balmin<<endl;
}
return 0;
}
int dfs(int par,int order)
{
int &ans=all[order];
int sonmax=0;
ans=1;
for(int i=0;i<edge[order].size();i++)
{
int end=edge[order][i];
if(end!=par)
{
ans += dfs(order, end);
if(sonmax<all[end])
sonmax=all[end];
}
}
sonmax=max(sonmax,n-ans);
if(sonmax<balmin)
{
balmin=sonmax;
weindex=order; //树的重心
}
//cout<<"当前节点: "<<order<<"\t"<<"最大子连同树: "<<sonmax<<endl;
return ans;
}
这是TLE了的代码
//poj1655
#include<iostream>
#include<vector>
#include<cstring>
#include<limits.h>
// #include<Windows.h>
using namespace std;
const int nodemax=20001;
vector<int>edge[nodemax];
int n;
int balmin; //最大的子连通树的大小
int all[nodemax]; //计算该节点的所有子节点的和(包括自己本身
int weindex;
int dfs(int par,int order); //par父节点 order当前节点的序号
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
memset(edge,0,sizeof(edge));
// edge.clear();
// vector<int> temp;
// for(int i=0;i<=n;i++)
// edge.push_back(vector<int>(0));
// edge.swap(vector< vector<int> >temp(n+1));
memset(all,0,sizeof(all));
balmin=INT_MAX;
weindex=-1;
int st,end;
for(int i=1;i<n;i++)
{
cin>>st>>end;
edge[st].push_back(end);
edge[end].push_back(st);
}
//for check
/*
cout<<"*********************"<<endl;
for(int i =1;i<=n;i++)
{
for(int j=0;j<edge[i].size();j++)
{
cout << edge[i][j]<< " ";
}
cout<<endl;
}
cout<<"*********************"<<endl;
*/
dfs(-1,1);
cout<<weindex<<' '<<balmin<<endl;
}
return 0;
}
int dfs(int par,int order)
{
int &ans=all[order];
int sonmax=0;
ans=1;
for(int i=0;i<edge[order].size();i++)
{
int end=edge[order][i];
if(end!=par)
{
ans += dfs(order, end);
if(sonmax<all[end])
sonmax=all[end];
}
}
sonmax=max(sonmax,n-ans);
if(sonmax<balmin)
{
balmin=sonmax;
weindex=order; //树的重心
}
//cout<<"当前节点: "<<order<<"\t"<<"最大子连同树: "<<sonmax<<endl;
return ans;
}
把vector< vector < int> >edge改成vector< int >edge[nodemax],并且对应的初始化方式换一下就可以。TLE估计是因为我在每次初始化前者的时候花了太长时间了吧,下次注意,其实用后者声明二维数组(第一维是动态的)也是很方便的啊~
就是938MS有点懵…自己算的明明是O(n)的算法…可能是STL的不管怎么初始化就是慢吧…下次还是老老实实邻接表吧…