标签:while via namespace 最长路径 run art help nav family
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 5496 | Accepted: 2685 | |
Case Time Limit: 1000MS |
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S
52
求树的直径,可以两遍bfs,求树的直径。
我做的是树形dp。
随便找一个节点把无根树变为有根树,考虑随便找一个根,得到一棵有根树。那么每条路径都有一个根。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 7 const int MAXN = 50010; 8 struct Edge{ 9 int to,nxt,w; 10 }e[500100]; 11 int head[MAXN],dp[MAXN]; 12 bool vis[MAXN]; 13 int n,m,tot,ans; 14 char s[5]; 15 16 inline void init() 17 { 18 memset(vis,false,sizeof(vis)); 19 memset(dp,0,sizeof(dp)); 20 memset(head,0,sizeof(head)); 21 tot = 0; 22 ans = 0; 23 } 24 inline void add_edge(int u,int v,int w) 25 { 26 e[++tot].to = v;e[tot].w = w;e[tot].nxt = head[u]; 27 head[u] = tot; 28 e[++tot].to = u;e[tot].w = w;e[tot].nxt = head[v]; 29 head[v] = tot; 30 } 31 void dfs(int u) 32 { 33 vis[u] = true; 34 for (int i=head[u]; i; i=e[i].nxt) 35 { 36 int v = e[i].to,w = e[i].w; 37 if (!vis[v]) 38 { 39 dfs(v); 40 ans = max(ans,dp[u]+w+dp[v]); 41 dp[u] = max(dp[u],dp[v]+w); 42 } 43 } 44 } 45 int main() 46 { 47 while (~scanf("%d%d",&n,&m)) 48 { 49 init(); 50 for (int x,y,z,i=1; i<=m; ++i) 51 { 52 scanf("%d%d%d%s",&x,&y,&z,s); 53 add_edge(x,y,z); 54 } 55 dfs(1); 56 printf("%d\n",ans); 57 } 58 return 0; 59 }
标签:while via namespace 最长路径 run art help nav family
原文地址:http://www.cnblogs.com/mjtcn/p/7367315.html