UVALive-4302 Toll Road 思維+dfs+動規
阿新 • • 發佈:2018-12-11
這道題想到用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; }