为什么可以用dfs呢,因为它是一棵树,n个点n-1条边。虽然感觉dijkstra算法效率够高了只有O(n)的复杂度,但是这个dfs也是啊,而且效率更高。
学习点:用vector数组来表示临界表,我一直以为要自己写效率很低容易错的邻接表呢。这个方法不错!
易错点:图是无向图,不要搞错有向图了,而且要注意初始化。
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int const maxn = 10010;
int n;
int d[maxn];
int vis[maxn];
int ans = 0;
struct node {
int ed,len;
node(int b,int c):ed(b),len(c){}
};
vector<node> v[maxn];
void f(int k) {
for (int i=0;i<v[k].size();i++) {
if(!vis[v[k][i].ed]&&d[v[k][i].ed]<d[k]+v[k][i].len) {
d[v[k][i].ed]=d[k]+v[k][i].len;
if(ans<d[v[k][i].ed]) ans = d[v[k][i].ed];
vis[v[k][i].ed] = 1;
f(v[k][i].ed);
}
}
}
int main() {
int k;
while(cin>>n>>k) {
for(int i=1;i<=n;i++) v[i].clear();
for (int i=0;i<n-1;i++) {
int a,b,c;
cin>>a>>b>>c;
v[a].push_back(node(b,c));
v[b].push_back(node(a,c)); //双向边写错
}
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
ans = 0;
vis[k] = 1;
f(k);
cout<<ans<<endl;
}
}
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int nv,k;
int const maxn = 10010;
int dis[maxn];
int vis[maxn];
int tans = 0;
struct Edge {
int vex;
int val;
Edge(int _vex,int _val):vex(_vex),val(_val){}
};
vector<Edge> E[maxn];
int f(int st) {
// memset(vis,0,sizeof(vis));
// memset(dis,0,sizeof(dis));
// dis[st] = 0; vis[st] = 1;
// for (int i=0;i<E[st].size();i++) {
// dis[E[st][i].vex] = E[st][i].val;
// }
// int ans = 0;
// for (int i=1;i<nv;i++) {
// int tmp = 0,tt = st;
// for (int j=1;j<=nv;j++) {
// if(!vis[j]&&tmp<dis[j]) {
// tmp = dis[j];
// tt = j;
// }
// }
// if(ans<tmp) ans = tmp;
// //if(tt==st) return ans;
// vis[tt] = 1;
// for(int j=0;j<E[tt].size();j++) {
// if(!vis[E[tt][j].vex]&&dis[E[tt][j].vex]<tmp+E[tt][j].val) {
// dis[E[tt][j].vex]=tmp+E[tt][j].val;
// }
// }
// }
// return ans;
for (int i=0;i<E[st].size();i++) {
if (!vis[E[st][i].vex]&&dis[E[st][i].vex]<E[st][i].val+dis[st]) {
dis[E[st][i].vex]=E[st][i].val+dis[st];
if (tans<dis[E[st][i].vex]) tans = dis[E[st][i].vex];
vis[E[st][i].vex]=1;
f(E[st][i].vex);
}
}
}
int main() {
while(cin>>nv>>k) {
for (int i=1;i<=nv;i++) E[i].clear();
for (int i=1;i<nv;i++) {
int a1,a2,a3;
cin>>a1>>a2>>a3;
Edge tmp1(a1,a3),tmp2(a2,a3);
E[a1].push_back(tmp2);
E[a2].push_back(tmp1);
}
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
tans = 0;
vis[k] = 1;
f(k);
cout<<tans<<endl;
}
}