PATクラスA-1021最深ルート(25ポイント)

タイトル:1021 Deepest Root(25ポイント)
分析:特定のノードがルートである場合に最も深いルートを見つけます。この質問はタイムアウトする可能性があります。ベクトルを使用して2次元配列を表します。
質問:コード1は2回目に書き込まれたタイムアウトで、コード2は初めて書き込まれたACです。タイムアウトコードの問題が見つかりません。不快ですo(╥﹏╥)o10分以上見つかりましたリリース時間前、get_node関数の問題で、depth == mの場合、直接挿入することはできませんが、変更後も問題はありません。
コード1:タイムアウト
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#define MAX 99999999
using namespace std;

int n;

//int road[10001][10001];
vector<int> road[10001];
int visi[10001];
int c_m;
int m = -1;
set<int>v;

void ju(int root)
{
    
    
    visi[root] = 1;
    if(road[root].size() == 0)return;
    for(int i = 0;i<road[root].size();i++)
        if(visi[road[root][i]] == 0)
            ju(road[root][i]);
}

void dfs(int root)
{
    
    
    visi[root] = 1;
    if(m < c_m)
        m = c_m;

    for(int i = 0;i<road[root].size();i++){
    
    
        if(visi[road[root][i]] == 0){
    
    
            c_m++;
            dfs(road[root][i]);
            c_m--;
        }
    }
    visi[root] = 0;
}
void get_node(int root,int k)
{
    
    
    visi[root] = 1;
    if(c_m == m){
    
    
        v.insert(k);
        visi[root] = 0;
        return;
    }
    for(int i = 0;i<road[root].size();i++){
    
    
        if(visi[road[root][i]] == 0){
    
    
            c_m++;
            get_node(road[root][i],k);
            c_m--;
        }
    }
    visi[root] = 0;
}

int main()
{
    
    
    //ios_base::sync_with_stdio(false);
    //cin.tie(0);

    scanf("%d",&n);
    for(int i = 0;i<n-1;i++){
    
    
        int a,b;
        //cin>>a>>b;
        scanf("%d%d",&a,&b);
        road[a].push_back(b);
        road[b].push_back(a);
    }
    int flag = 0;
    for(int i = 1;i<=n;i++){
    
    
        if(visi[i] == 0){
    
    
            flag ++;
            ju(i);
        }
    }
    if(flag != 1){
    
    
        cout<<"Error: "<<flag<<" components";
        return 0;
    }
    memset(visi,0,sizeof(visi));
    for(int i = 1;i<=n;i++){
    
    
        c_m = 0;
        dfs(i);
        if(c_m > m)
            m = c_m;
    }
    for(int i = 1;i<=n;i++){
    
    
        c_m = 0;
        get_node(i,i);
    }


    for(auto i = v.begin();i!=v.end();i++)
        printf("%d\n",*i);

    return 0;
}

コード2:AC
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#define MAX 99999999

typedef long long ll;
using namespace std;


int n,m;


vector<int> edge[10001];
int max_h = -1;
vector<int>ans;
int visi[10001];
void dfs(int root,int depth)
{
    
    
    visi[root] = 1;
    if(depth>max_h)
        max_h = depth;
    if(edge[root].size()==0)
        return ;

    for(int i = 0;i<edge[root].size();i++)
    {
    
    
        if(!visi[edge[root][i]])
            dfs(edge[root][i],depth+1);
    }

    visi[root] = 0;
}
int no;
void dd(int root,int depth)
{
    
    
    visi[root] = 1;
    if(depth==max_h)
        no = 1;
    if(edge[root].size()==0)
        return ;

    for(int i = 0;i<edge[root].size();i++)
    {
    
    
        if(!visi[edge[root][i]])
            dd(edge[root][i],depth+1);
    }

    visi[root] = 0;
}

void che(int root)
{
    
    
    visi[root] = 1;

    if(edge[root].size()==0)
        return ;

    for(int i = 0;i<edge[root].size();i++)
    {
    
    
        if(!visi[edge[root][i]])
            che(edge[root][i]);
    }


}


int main()
{
    
    
    scanf("%d",&n);

    for(int i = 0;i<n-1;i++)
    {
    
    
        int a,b;
        scanf("%d%d",&a,&b);
        edge[a].push_back(b);
        edge[b].push_back(a);
    }
    int t = 0;
    for(int i = 1;i<=n;i++)
    {
    
    
        if(visi[i]==0)
        t++;
        che(i);
    }

    if(t!=1)
    {
    
    
        cout<<"Error: "<<t<<" components";
        return 0;
    }

    memset(visi,0,sizeof(visi));
    for(int i = 1;i<=n;i++)
    {
    
    
        dfs(i,0);
    }

    for(int i = 1;i<=n;i++)
    {
    
    
        no = 0;
         dd(i,0);
         if(no)
            ans.push_back(i);
    }

    for(int i =0;i<ans.size();i++)
        cout<<ans[i]<<endl;



    return 0;
}

おすすめ

転載: blog.csdn.net/qq_43567222/article/details/112834119