这个题真的是胡乱想了个算法,然后WA了好多次,最后我找到了一组没过的数据,改了之后就AC了。。
图是一个无向无环图,其实就是一棵树。
百度到的题解用了dfs,递归每棵子树,答案可能是某两棵子树的和,最后返回一棵最长的子树。
我的思路类似于拓扑排序或者关键路径,其实原理都是一样的。从度为1的节点开始拓展,不断拓展出更长的路径。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <map> #include <stack> #include <algorithm> #define MAXN 10005 #define MOD 1000000007 #define INF 10000000 #define ll long long using namespace std; struct Edge { int a,b,w; Edge(int x=0,int y=0,int z=0) :a(x),b(y),w(z) {} }; int main() { char str[100]; while(gets(str)) { vector<Edge> gl[MAXN]; int from[MAXN]= {0},in[MAXN]= {0}; int x=0,y=0,z=0,n=0; int dis[MAXN]= {0}; int ans=0; if(strlen(str)) { sscanf(str,"%d%d%d",&x,&y,&z); in[x]++; in[y]++; n=max(n,max(x,y)); gl[x].push_back(Edge(x,y,z)); gl[y].push_back(Edge(y,x,z)); while(gets(str)&&strlen(str)) { sscanf(str,"%d%d%d",&x,&y,&z); in[x]++; in[y]++; gl[x].push_back(Edge(x,y,z)); gl[y].push_back(Edge(y,x,z)); n=max(n,max(x,y)); } stack<int> sk; for(int i=1; i<=n; ++i) if(in[i]==1) sk.push(i); while(!sk.empty()) { int gettop=sk.top(); sk.pop(); for(int i=0; i<gl[gettop].size(); ++i) { int ed=gl[gettop][i].b,cost=gl[gettop][i].w; if(from[gettop]==ed) continue; ans=max(ans,dis[gettop]+cost+dis[ed]);//这句非常重要,加上这句才AC了。。 if(dis[gettop]+cost>dis[ed]) { dis[ed]=dis[gettop]+cost; from[ed]=gettop; } in[ed]--; if(in[ed]==1) sk.push(ed); } } } printf("%d\n",ans); } return 0; }
递归写法
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <map> #include <stack> #include <algorithm> #define MAXN 10005 #define MOD 1000000007 #define INF 10000000 #define ll long long using namespace std; struct Edge { int a,b,w; Edge(int x=0,int y=0,int z=0) :a(x),b(y),w(z) {} }; int ans,n; int dfs(int node,int father,vector<Edge> gl[]) { int maxn=0; for(int i=0; i<gl[node].size(); ++i) { int ed=gl[node][i].b,cost=gl[node][i].w; if(ed==father) continue; int val=dfs(ed,node,gl)+cost; ans=max(ans,maxn+val); maxn=max(maxn,val); } return maxn; } int main() { char str[100]; while(gets(str)) { vector<Edge> gl[MAXN]; int x=0,y=0,z=0; int dis[MAXN]= {0}; n=ans=0; if(strlen(str)) { sscanf(str,"%d%d%d",&x,&y,&z); n=max(n,max(x,y)); gl[x].push_back(Edge(x,y,z)); gl[y].push_back(Edge(y,x,z)); while(gets(str)&&strlen(str)) { sscanf(str,"%d%d%d",&x,&y,&z); gl[x].push_back(Edge(x,y,z)); gl[y].push_back(Edge(y,x,z)); n=max(n,max(x,y)); } } dfs(1,-1,gl); printf("%d\n",ans); } return 0; }