冲刺阶段:补上一直不是很明白的 数组邻接表+树的直径问题

第一次解决树的直径问题,为了避免机试不让用stl,专门练一下数组邻接表
这个题目是POJ 点击打开链接
是一个很基础,很常见的题型。下面是两种方法,一个手搓的链表,一个vector的容器,第二个超时,会出现效率问题。一开始用cin直接被卡死,多了900ms,后来改成了scanf,才过,但还是用1000ms的时间消耗

代码:

#include
#include
#include
#include
using namespace std ;
#define MAX 100005

struct edge{
    int to ,next,dis ;
}e[MAX];
bool vis[MAX];
int head[MAX];

void init()
{
    memset(vis,0,sizeof(vis));
    memset(head,-1,sizeof(head));
}
int k ,max_dis,max_pos;
void AddEdge(int from ,int to ,int dis){
    e[k].to = to ;
    e[k].dis = dis;
    e[k].next = head[from];
    head[from]=k++ ;
}

void dfs(int start,int dis){
    vis[start]=1;
    /*if(max_dis < dis)
    {
            max_dis = dis;
            max_pos = start;
    }*/
    for(int i = head[start]; i >-1 ; i = e[i].next)
    {

        int to = e[i].to;
        if(!vis[to])
        {
            if(max_dis >f>>t>>d>>c;
            AddEdge(f,t,d);
            AddEdge(t,f,d);
        }
        k = 0 ;
        max_dis = 0 ;
        dfs(1,0);
        memset(vis,0,sizeof(vis));
        max_dis = 0 ;
        dfs(max_pos,0);
        printf("%d\n",max_dis);
    }

}
代码:
#include
#include
#include
#include
using namespace std ;
#define MAX 500000
#include
struct Node{
    int to ;
    int dis;
    Node(int too ,int diss){
       to =too; dis =diss;
    }
};
vector   vertex[MAX];

bool vis[MAX];

int res_pos,res_max;
void dfs(int s,int dis){

    if(dis>res_max)
    {
        res_max = dis;
        res_pos = s ;
    }
    vis[s]=1 ;
    for(int i = 0 ; i < vertex[s].size();i++)
    {
        int to = vertex[s][i].to;

        if(!vis[to])
        {
             dfs(to,dis+vertex[s][i].dis);
        }

    }
}
int main(){

    int n ,m ,from, to , dis ;
    char c ;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i = 0 ; i < n ; i ++)
        {
            vertex[i].clear();
        }
        for(int i = 0 ; i < m ; i ++)
        {
            scanf("%d %d %d %c",&from ,&to ,&dis,&c);
           // cin>>from>>to>>dis>>c;
            vertex[from-1].push_back(Node(to-1,dis));
            vertex[to-1].push_back(Node(from-1,dis));
        }
        memset(vis,0,sizeof(vis));
        res_max = 0 ;
        dfs(0,0);
        memset(vis,0,sizeof(vis));
        res_max  = 0 ;
        dfs(res_pos,0);
        printf("%d\n",res_max);
    }
}


你可能感兴趣的:(算法)