HDU 2196

树的直径来做的代码还是不知道为什么WA 求指正

用dfs的方法建的的无向图 (建有向图的话应该需要vis标记)

但是忘记初始化浪费了半天= =

#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#define maxn 10005
using namespace std;
#define inf 1000000005
vector<int>G[maxn];
int vis[maxn];
int d1[maxn],d2[maxn];
int s,n;
struct Edge
{
    int from,to,va;
};
vector<Edge>edges;
void AddEdge(int from,int to,int va)
{
    edges.push_back((Edge){from,to,va});
    edges.push_back((Edge){to,from,va});
    int k =(int)edges.size();
    G[from].push_back(k-2);
    G[to].push_back(k-1);
}
void dep(int *d,int &s)
{
    for(int i=1;i<=n;++i)
    {
        d[i]=inf;
        vis[i]=0;
    }
    queue<int>q;
    q.push(s);
    vis[s]=1;
    d[s]=0;
    while(!q.empty())
    {
        s=q.front();
        q.pop();
        for(int i=0;i<G[s].size();++i)
        {
            Edge &x=edges[G[s][i]];
            if(d[x.to]>d[s]+x.va){d[x.to]=d[s]+x.va;}
            if(!vis[x.to])
            {
                vis[x.to]=1;
                q.push(x.to);
            }
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(d1,0,sizeof d1);
        memset(d2,0,sizeof d2);
        int a,va;
        for(int i=2;i<=n;++i)
        {
            scanf("%d%d",&a,&va);
            AddEdge(i,a,va);
            
        }
        int t=1;
        dep(d1,t);
        //     printf(" %d\n",t);
        t=1;
        for(int i=1;i<=n;++i)
        {
            //   printf("%d ",d1[i]);
            if(d1[i]>d1[t])
            {t=i;}
        }
        //   printf("\n");
        dep(d1,t);
        dep(d2,t);
        for(int i=1;i<=n;++i)
        {
            printf("%d\n",max(d1[i],d2[i]));
        }
        for(int i=0;i<=n;++i)
        {G[i].clear();}
        edges.clear();
    }
    
}

忘记初始化了 结果浪费了一个下午 真是太菜了

两次dfs方法来做的代码:

#include<stdio.h>
#include<algorithm>
//#include<cstring>
#include<string.h>
#include<iostream>
#include<vector>
using namespace std;
#define maxn 10010
struct Edge
{
    int from,to,va;
};
void swap(int &a,int &b)
{
    int c=a;
    a=b;
    b=c;
    
}
vector<Edge>edges;
vector<int> G[maxn];
int vis[maxn];
int fi[maxn],fin[maxn];
int se[maxn],sen[maxn];
void AddEdge(int from,int to,int va)
{
    edges.push_back((Edge){from,to,va});
    int m=(int)edges.size();
     G[from].push_back(m-1);
}
void dfs1(int n)
{
    
    for(int i=0;i<G[n].size();++i)
    {
        Edge &e=edges[G[n][i]];
     //    printf("sda %d",e.to);
            dfs1(e.to);
          
         if(se[n]<fi[e.to]+e.va)
           {
             se[n]=fi[e.to]+e.va;
              sen[n]=e.to;
              if(se[n]>fi[n])
                 {
                   swap(se[n],fi[n]);
                    swap(fin[n],sen[n]);
                  }
            }
    }
}
void dfs2(int n)
{
    vis[n]=1;
    
    for(int i=0;i<G[n].size();++i)
    {
        
        Edge &e =edges[G[n][i]];
        if(vis[e.to]){continue;}
        if(fin[n]==e.to)
        {
            if(se[n]+e.va>se[e.to])
            {
               se[e.to]=se[n]+e.va;
                sen[e.to]=n;
                if(se[e.to]>fi[e.to])
                {
                    swap(se[e.to],fi[e.to]);
                    swap(sen[e.to],fin[e.to]);
                }
            }
            
        }
        else
        {
            if(fi[n]+e.va>se[e.to])
            {
                
                 se[e.to]=fi[n]+e.va;
                 sen[e.to]=n;                       //方向
                if(se[e.to]>fi[e.to])
                {
                    swap(sen[e.to],fin[e.to]);
                    swap(se[e.to],fi[e.to]);
                }
            }
        }
        dfs2(e.to);
    }
    
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int from,va;
        memset(fi,0,sizeof fi);
        memset(se,0,sizeof se);
        memset(fin,0,sizeof fin);
        memset(sen,0,sizeof sen);
        for(int i=2;i<=n;i++)
        {
            scanf("%d%d",&from,&va);
            AddEdge(from,i,va);
        }
    
        memset(vis,0,sizeof vis);
        dfs1(1);
        

         memset(vis,0,sizeof vis);
        dfs2(1);
       for(int i=1;i<=n;++i)
         {printf("%d\n",fi[i]);}
        for(int i=0;i<=n;++i)
        {
            G[i].clear();
        }
        edges.clear();
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值