POJ-1985 树的最长路径

来源:互联网 发布:十颗心大数据 编辑:程序博客网 时间:2024/06/05 18:18

紫书上dp写法的代码链接
两次dfs的代码链接

我的垃圾代码,WA
想要两次dfs解决,还加了点没必要dp,搞到最后也不知道什么用例通不过,还是得好好长点姿势才行啊:

#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <iostream>#include <cmath>#include <vector>#include <algorithm>#include <map>using namespace std;#define DEBUGconst int maxn=70000+5,maxv=26,INF=0x3f3f3f3f;struct Edge{      int to;      int next;      int w;}edge[2 * maxn];int cnt,head[maxn],dp[maxn],p;char c;void add(int u,int v,int w){    edge[cnt].w=w;    edge[cnt].to=v;    edge[cnt].next=head[u];    head[u]=cnt++;}void dfs(int u,int r){    dp[u]=0;    for(int i=head[u];~i;i=edge[i].next){        int t=edge[i].to;        if(t==r)continue;        dfs(t,u);        dp[u]=max(dp[u],dp[t]+edge[i].w);    }}void find(int u,int r){    int temp=0;    int node=-1;    for(int i=head[u];~i;i=edge[i].next){        int t=edge[i].to;        if(t==r)continue;        if(temp<dp[t]+edge[i].w){            temp=dp[t];node=t;        }        // if(u==1)printf("            to=%d dp=%d\n",t,dp[t] );    }    // printf("%d~~",u );    if(node!=-1)find(node,u);    // else p=u;    if(p==-1)p=u;}int main(){#ifdef DEBUG    freopen("in.txt", "r", stdin);    freopen("out.txt", "w", stdout);#endif    int n,m;    while(scanf("%d%d\n",&n,&m)&&n!=0){        int a,b,w;        cnt=0;p=-1;        memset(dp,0,sizeof(dp));        memset(head,-1,sizeof(head));        while(m--){            scanf("%d%d%d %c\n",&a,&b,&w,&c);            // printf("%d %d %d %c\n",a,b,w,c);            add(a,b,w);              add(b,a,w);          }        dfs(1,-1);        find(1,-1);        // printf("%d %d\n",p,dp[1]);        // for(int i=1;i<=n;i++)printf("---%d %d\n",i,dp[i] );        memset(dp,0,sizeof(dp));        dfs(p,-1);        printf("%d\n",dp[p]);    }#ifdef DEBUG    fclose(stdin);    fclose(stdout);#endif    return 0;}
原创粉丝点击