题目意思: 给你一张图,让你判断图中是否有环,如果没环求出最长的路径。
一个dfs,判断是否走到同一个点,如是,则说明是有环,不是则走到最远处u,在以u为起点dfs。
发现不用pragma照样没事
#pragma comment <linker,"/STACK:1024000000,1024000000">
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 100010;
struct vertex {
int head;
}V[N];
int dis[N];
int vis[N];
struct edge{
int v,w,next; //分别表示一个端点,权值 ,下一个兄弟的索引
}E[N*10*2];
int top = 0;
int fg=0;
void add_edge(int u,int v,int w){
E[top].v = v;
E[top].w = w;
E[top].next = V[u].head;
V[u].head = top++;
}
int dfs(int cur,int pre){
int i;
vis[cur] = 1;
for(i = V[cur].head ; i != -1 ; i = E[i].next){
if(E[i].v == pre)
continue;
if(vis[E[i].v] == 1)
{
fg = 1;
return 0;
}
dis[E[i].v] = dis[cur] + E[i].w;
if(!dfs(E[i].v,cur))
return 0;
}
return 1;
}
void init(int n){
int i;
top = 0;
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(i=0;i<=n;i++){
V[i].head = -1;
}
}
void debug(int key){
int i;
printf("%d %d\n",key,V[key].head);
for(i = V[key].head ;i != -1;i = E[i].next){
printf("%d :",E[i].v);
//system("pause");
}
printf("\n");
}
int main()
{
int i,j,k,n,m,u,v,w;
int ans;
while(scanf("%d%d",&n,&m)!=EOF){
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
ans =0 ;
for(i=0;i<=n;i++){
V[i].head = -1;
}
top = 0;
for(i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
for(i=1;i<=n;i++){
if(vis[i])
continue;
memset(dis,0,sizeof(dis));
if(dfs(i,-1) == 0){
break;
}
int v = max_element(dis+1,dis+1+n) - dis;
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
if(dfs(v,-1) == 0){
break;
}
v = max_element(dis+1,dis+1+n) - dis;
ans = max(ans,dis[v]);
}
if(i>n)
printf("%d\n",ans);
else printf("YES\n");
}
return 0;
}