洛谷P1294 高手去散步 搜索

洛谷P1294 高手去散步
搜索
求一个图的最长路
从任意点出发 任意点结束的最长路

dfs深搜 枚举 那个点是起点
其实正宗最长路 在中间也要判一下最大
防止图中有负权边

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream>
 9 using namespace std ; 
10 
11 const int maxn = 21,maxm = 51,inf = 1e9 ; 
12 int n,m,cnt,mx ; 
13 int head[maxn] ; 
14 bool visit[maxn] ; 
15 struct node{
16     int to,val,pre ; 
17 }e[maxm*2];
18 
19 inline int read() 
20 {
21     char ch = getchar() ; 
22     int x = 0 , f = 1 ; 
23     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 
24     while(ch>='0'&&ch<='9') { x = x*10+ch-48 ; ch = getchar() ; } 
25     return x * f ; 
26 }
27 
28 inline void add(int x,int y,int v) 
29 {
30     e[++cnt].to = y ; 
31     e[cnt].val = v ;
32     e[cnt].pre = head[x] ; 
33     head[x] = cnt ;  
34 }
35 
36 inline void dfs(int u,int sum) 
37 {
38     if(sum > mx) mx = sum ; 
39     int v ; 
40     visit[ u ] = 1 ;  
41     for(int i=head[u];i;i=e[ i ].pre) 
42     {
43         v = e[ i ].to ; 
44         if(!visit[ v ]) 
45             dfs(v,sum+e[ i ].val) ; 
46     }
47     visit[ u ] = 0 ; 
48 }
49 
50 int main() 
51 {
52     n = read() ;    m = read() ; 
53     int x,y,v ; 
54     mx = -inf ; 
55     for(int i=1;i<=m;i++) 
56     {
57         x = read() ; y = read() ; v = read() ; 
58         add(x,y,v) ;  add(y,x,v) ; 
59     } 
60     for(int i=1;i<=n;i++) 
61     {
62         for(int j=0;j<=n;j++) visit[ j ] = 0 ;     //   初始化一下 
63         dfs( i,0 ) ;  
64     }
65     printf("%d",mx) ; 
66     return 0 ; 
67 }
原文地址:https://www.cnblogs.com/third2333/p/7093555.html