Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3269 Accepted Submission(s): 587
DP求树上最长链
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<cstdlib> #include<algorithm> #include<vector> using namespace std; struct node { int v,w; node(int _v, int _w) : v(_v), w(_w) {} }; vector<node> e[100001]; int n,m,fa[100001],dp[100001],ans; int find(int x) { if(x!=fa[x]) fa[x]=find(fa[x]); return fa[x]; } void dfs(int u,int father) { int maxx=0; for(int i=0;i<e[u].size();i++) { int v=e[u][i].v; int w=e[u][i].w; if(v==father) continue; dfs(v,u); ans=max(ans,dp[v]+maxx+w); maxx=max(maxx,dp[v]+w); } dp[u]=maxx; } void slove() { for(int i=1;i<=n;i++) { if(dp[i]==-1) dfs(i,-1); } printf("%d\n",ans); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { bool flag=false; ans=0; for(int i=1;i<=n;i++) fa[i]=i,dp[i]=-1,e[i].clear(); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); e[x].push_back(node(y,z)); e[y].push_back(node(x,z)); if(flag) continue; int fx,fy; fx=find(x),fy=find(y); if(fx!=fy) { fa[fx]=fy; } else { flag=true; continue; } } if(flag) { printf("YES\n"); continue; } slove(); } return 0; }
原文:http://www.cnblogs.com/water-full/p/4493765.html