我的垃圾代码,WA
想要两次dfs解决,还加了点没必要dp,搞到最后也不知道什么用例通不过,还是得好好长点姿势才行啊:
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
#define DEBUG
const int maxn=70000+5,maxv=26,INF=0x3f3f3f3f;
struct Edge{
int to;
int next;
int w;
}edge[2 * maxn];
int cnt,head[maxn],dp[maxn],p;
char c;
void add(int u,int v,int w){
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int u,int r){
dp[u]=0;
for(int i=head[u];~i;i=edge[i].next){
int t=edge[i].to;
if(t==r)continue;
dfs(t,u);
dp[u]=max(dp[u],dp[t]+edge[i].w);
}
}
void find(int u,int r){
int temp=0;
int node=-1;
for(int i=head[u];~i;i=edge[i].next){
int t=edge[i].to;
if(t==r)continue;
if(temp<dp[t]+edge[i].w){
temp=dp[t];node=t;
}
// if(u==1)printf(" to=%d dp=%d\n",t,dp[t] );
}
// printf("%d~~",u );
if(node!=-1)find(node,u);
// else p=u;
if(p==-1)p=u;
}
int main(){
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int n,m;
while(scanf("%d%d\n",&n,&m)&&n!=0){
int a,b,w;
cnt=0;p=-1;
memset(dp,0,sizeof(dp));
memset(head,-1,sizeof(head));
while(m--){
scanf("%d%d%d %c\n",&a,&b,&w,&c);
// printf("%d %d %d %c\n",a,b,w,c);
add(a,b,w);
add(b,a,w);
}
dfs(1,-1);
find(1,-1);
// printf("%d %d\n",p,dp[1]);
// for(int i=1;i<=n;i++)printf("---%d %d\n",i,dp[i] );
memset(dp,0,sizeof(dp));
dfs(p,-1);
printf("%d\n",dp[p]);
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}