解题分析:首先用并查集或dfs判环,然后求图中的最长路径。这里需要知道一个知识点:求一个连通块中的最长路径,首先,从任意从该连通块中任意一个结点出发,求最长路径,最长路径的端点是S,然后再从S出发求最长路径L,路径L就是所要求的路径,自己画个图想一下就可以理解了。
代码如下:
#include<iostream>
#include<algorithm>
#include<>
#include<>
#include<cstring>
#include<string>
#include<vector>
#define N 100005
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using 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;
= x; = w;
q[y].push_back(temp);
= 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;
}