这道题想到用dfs和dp了,,但是不会写QAQ。。后来看了某大佬的代码,太强了Orz
状态转移方程为dp[u]+=max(0,dp[v]+w),另外很巧的一点是先深搜再转移(注意!!!)
附上AC代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
typedef pair<int,int>pp;
#define mkp make_pair
#define pb push_back
const double pi=acos(-1.0);
const double eps=1e-9;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+(ll)7;
const int MAX=200001;
int dp[MAX];
bool vis[MAX];
vector<pp>vt[MAX];
int ans;
void dfs(int u)
{
vis[u]=true;
/*if(vt[u].size()>=1)
cout<<" u="<<u<<endl;*/
for(int i=0;i<vt[u].size();i++)
{
int v=vt[u][i].first;
//cout<<"v="<<v<<endl;
int w=vt[u][i].second;
if(!vis[v])
{
dfs(v);//先深搜
/*cout<<"u="<<u<<" v="<<v;
cout<<" dp原="<<dp[u];*/
dp[u]+=max(0,dp[v]+w);//再转移
//cout<<" dp现="<<dp[u]<<endl;
ans=max(ans,dp[u]);
}
}
}
int main()
{
int m;
while(scanf("%d",&m)==1)
{
if(m==0)
break;
int u,v,w;
for(int i=0;i<MAX;i++)
{
dp[i]=0;
vis[i]=false;
vt[i].clear();
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
vt[u].pb(mkp(v,w));
vt[v].pb(mkp(u,w));
}
ans=0;
for(int i=1;i<MAX;i++)
if(!vis[i])
{
dfs(i);
}
printf("%d\n",ans);
}
return 0;
}