POJ1655 终于找到TLE的原因

//poj1655 
#include
#include
#include
#include
// #include
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 temp;
        for(int i=0;i<=n;i++)
            edge.push_back(vector<int>(0));
        // edge.swap(vector< vector >temp(n+1)); 
        memset(all,0,sizeof(all));
        balmin=INT_MAX;
        weindex=-1;

        int st,end;
        for(int i=1;icin>>st>>end;
            edge[st].push_back(end);
            edge[end].push_back(st);
        }

    //for check
        /* cout<<"*********************"<
        dfs(-1,1);
        cout<' '<return 0;
}

int dfs(int par,int order)
{
    int &ans=all[order];
    int sonmax=0;       
    ans=1;
    for(int i=0;iint end=edge[order][i];
        if(end!=par)
        {
            ans += dfs(order, end);
            if(sonmaxif(sonmax//树的重心
    }

    //cout<<"当前节点: "<

    return ans;
}

这是TLE了的代码

//poj1655 
#include
#include
#include
#include
// #include
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 temp;
        // for(int i=0;i<=n;i++)
        // edge.push_back(vector(0));
        // edge.swap(vector< vector >temp(n+1)); 
        memset(all,0,sizeof(all));
        balmin=INT_MAX;
        weindex=-1;

        int st,end;
        for(int i=1;icin>>st>>end;
            edge[st].push_back(end);
            edge[end].push_back(st);
        }

    //for check
        /* cout<<"*********************"<
        dfs(-1,1);
        cout<' '<return 0;
}

int dfs(int par,int order)
{
    int &ans=all[order];
    int sonmax=0;       
    ans=1;
    for(int i=0;iint end=edge[order][i];
        if(end!=par)
        {
            ans += dfs(order, end);
            if(sonmaxif(sonmax//树的重心
    }

    //cout<<"当前节点: "<

    return ans;
}

把vector< vector < int> >edge改成vector< int >edge[nodemax],并且对应的初始化方式换一下就可以。TLE估计是因为我在每次初始化前者的时候花了太长时间了吧,下次注意,其实用后者声明二维数组(第一维是动态的)也是很方便的啊~

就是938MS有点懵…自己算的明明是O(n)的算法…可能是STL的不管怎么初始化就是慢吧…下次还是老老实实邻接表吧…

你可能感兴趣的:(oj)