hdu4514(求图中最长的路径)

来源:互联网 发布:linux 打包压缩文件夹 编辑:程序博客网 时间:2024/04/30 10:19
题意:给一个图,如果存在环就输出YES,否则求出图中的最长路径(树的直径)。

解题分析:首先用并查集或dfs判环,然后求图中的最长路径。这里需要知道一个知识点:求一个连通块中的最长路径,首先,从任意从该连通块中任意一个结点出发,求最长路径,最长路径的端点是S,然后再从S出发求最长路径L,路径L就是所要求的路径,自己画个图想一下就可以理解了。

代码如下:

#include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#include<vector>#define N 100005#define inf 0x3f3f3f3f#define pi acos(-1.0)#define eps 10e-6using namespace std;struct node{    int u,w;};vector<node> q[N];int vis[N],tempvis[N];int flag;void dfs(int cur,int pre)//dfs判无向环{    vis[cur] = 1;    if(flag) return;    int i,len = q[cur].size();    for(i = 0; i < len; i++)    {        int temp = q[cur][i].u;        if(!vis[temp]) dfs(temp,cur);        else if(pre != temp)        {            flag = 1;            return;        }    }}int tempk,tempw;void dfs1(int cur,int cost){    //cout<<cost<<endl;    if(cost > tempw)    {        tempk = cur;        tempw = cost;    }    vis[cur] = 1;    tempvis[cur] = 1;    int i,len = q[cur].size();    for(i = 0; i < len; i++)    {        int t = q[cur][i].u;        if(!tempvis[t])            dfs1(t,cost+q[cur][i].w);    }}int main(){    int n,m;    while(scanf("%d%d",&n,&m) != EOF)    {        int i;        for(i = 0; i <= n; i++) q[i].clear();        for(i = 0; i < m; i++)        {            int x,y,w;            scanf("%d%d%d",&x,&y,&w);            node temp;            temp.u = x;temp.w = w;            q[y].push_back(temp);            temp.u = y;            q[x].push_back(temp);        }        flag = 0;        memset(vis,0,sizeof(vis));        for(i = 1; i <= n; i++)            if(!vis[i])                dfs(i,0);        if(flag) {            printf("YES\n");            continue;        }        int resw = -1;        memset(vis,0,sizeof(vis));        for(i = 1; i <= n; i++)        {            if(!vis[i]){                tempw = -1;                memset(tempvis,0,sizeof(tempvis));                dfs1(i,0);//求从i点出发的最长路径,到达的点是S                //cout<<resw<<endl;                if(tempw > resw) resw = tempw;                memset(tempvis,0,sizeof(tempvis));                tempw = -1;                dfs1(tempk,0);//从S出发求最长路径                if(tempw > resw) resw = tempw;            }        }        printf("%d\n",resw);    }    return 0;}


0 1