POJ 2631 DFS+帶權無向圖最長路徑


http://poj.org/problem?id=2631

2333水題,

有一個小技巧是說隨便找一個點作為起點,

找到這個點的最遠點,

以這個最遠點為起點,

再次找到的最遠點就是這個圖的最遠點

證明可以用三角形定理

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define maxn 10005
using namespace std;
struct donser
{
    int tow;
    int dis;
};
vector<donser> vec[maxn];
int maxdistances=0,distances=0,maxtown=0;
bool used[maxn];
void maxway(int x)
{
    int way=vec[x].size(),i=0;
    struct donser a;
    //cout<<"?x:"<<x<<" vec[x].size():"<<way<<endl;
    while(i<way)
    {
        a=vec[x].at(i);
        i++;
        if(used[a.tow]) continue;
        distances+=a.dis;
        //cout<<"+a.dis:"<<a.dis<<endl;
        used[a.tow]=1;
        maxway(a.tow);
        if(distances>=maxdistances)
        {
            maxdistances=distances;
            maxtown=a.tow;
        }
        used[a.tow]=0;
        //cout<<"-a.dis:"<<a.dis<<endl;
        distances-=a.dis;
    }
    return;
}
int main()
{
    int a,b,dist;
    struct donser num;
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d",&a,&b,&dist))
    {
        num.tow=b;
        num.dis=dist;
        vec[a].push_back(num);
        num.tow=a;
        vec[b].push_back(num);
    }
    used[1]=1;
    maxway(1);
    distances=0;
    //cout<<"!maxtown"<<maxtown<<"!maxdistances"<<maxdistances<<endl;
    memset(used,0,sizeof(used));
    maxway(maxtown);
    //cout<<"!maxtown"<<maxtown<<"!maxdistances"<<maxdistances<<endl;
    cout<<maxdistances<<endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM