树中最长的路径 - Spoj

时间:2015-05-26 14:45:24

标签: c++ algorithm graph tree dijkstra

IDK我的算法出了什么问题。给WA

我正在使用Dijkstra找到所有节点距起始节点的距离,然后打印最大距离。

链接:http://www.spoj.com/problems/PT07Z/

#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,start,end) for(int i=start;i<end;i++)
#define pii pair< int, int >

struct comp {
    bool operator() (const pii &a, const pii &b) {
        return a.second > b.second;
    }
};
priority_queue< pii ,vector< pii >, comp > Q;
#define Size 10009
vector<pii > G[Size];
int D[Size],Visited[Size];
int main() {
    int n,m,s=1,t,a,b,p,q,d;
    scanf("%d",&t);
    REP(i, t-1) {
        scanf("%d %d",&a,&b);
        G[a].push_back(pii(b, 1));
        G[b].push_back(pii(a, 1));
    }
    REP(i, t+2){D[i]=1000000;Visited[i]=0;}
    D[s]=0;
    Q.push(pii(s,0));
    while (!Q.empty()) {
        a=Q.top().first;
        Q.pop();
        if (Visited[a]) continue;
        m=G[a].size();
        REP(i, m){
            p=G[a][i].first;
            if (!Visited[p] && D[a]+1<D[p]) {
                D[p]=D[a]+1;
                Q.push(pii(p,D[p]));
            }
        }
        Visited[a]=1;
    }
    m=0;
    FOR(i, 1, t+1) if(D[i]>m && D[i]!=1000000) m=D[i];
    printf("%d\n",m);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

你不需要使用dijsktra来解决这个问题,因为边缘没有加权。

此问题与:"Find Tree Diameter"有关,您可以轻松解决:

  • 从节点A开始并运行BFS。
  • 现在从A获取最远的节点 (让我们称之为B)并从他们的。
  • 运行另一个BFS
  • 然后拿走 B的最远节点(让我们称之为C)。最远的距离 树是B和C之间的距离。

希望它有所帮助。