HDU 1520
题目传送门
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=6000+100;
struct Edge{
int to,next;
}edge[maxn];
int head[maxn],tot;
int dp[maxn][2],in[maxn];
void DFS(int u){
for(int i=head[u];i!=-1;i=edge[i].next){
Edge e=edge[i];
int v=e.to;
DFS(v);
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
}
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n;i++){
int val;
scanf("%d",&val);
dp[i][1]=val;
dp[i][0]=0;
in[i]=0;
head[i]=-1;
}
tot=0;
int u,v;
while(scanf("%d%d",&v,&u)==2&&u&&v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
in[v]++;
}
for(int i=1;i<=n;i++){
if(in[i]==0){
DFS(i);
printf("%d\n",max(dp[i][1],dp[i][0]));
break;
}
}
}
}
HDU 2196
题目传送门
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+100;
struct Edge{
int to,len,next;
}edge[maxn<<1];
int head[maxn],tot;
struct M{
int val;
int node;
}Max[maxn],SMax[maxn];
void DFS1(int u,int fa){
Max[u].val=0;
SMax[u].val=0;
for(int i=head[u];i!=-1;i=edge[i].next){
Edge e=edge[i];
int v=e.to;
if(v==fa) continue;
DFS1(v,u);
if(Max[v].val+e.len>SMax[u].val){
SMax[u].val=Max[v].val+e.len;
SMax[u].node=v;
if(SMax[u].val>Max[u].val){
swap(SMax[u],Max[u]);
}
}
}
}
void DFS2(int u,int fa){
for(int i=head[u];i!=-1;i=edge[i].next){
Edge e=edge[i];
int v=e.to;
if(v==fa) continue;
if(v==Max[u].node){
if(SMax[u].val+e.len>SMax[v].val){
SMax[v].val=SMax[u].val+e.len;
SMax[v].node=u;
if(SMax[v].val>Max[v].val){
swap(SMax[v],Max[v]);
}
}
}
else{
if(Max[u].val+e.len>SMax[v].val){
SMax[v].val=Max[u].val+e.len;
SMax[v].node=u;
if(SMax[v].val>Max[v].val){
swap(SMax[v],Max[v]);
}
}
}
DFS2(v,u);
}
}
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n;i++) head[i]=-1;
tot=0;
for(int i=2;i<=n;i++){
int node,len;
scanf("%d%d",&node,&len);
edge[tot].to=node;
edge[tot].len=len;
edge[tot].next=head[i];
head[i]=tot++;
edge[tot].to=i;
edge[tot].len=len;
edge[tot].next=head[node];
head[node]=tot++;
}
DFS1(1,-1);
DFS2(1,-1);
for(int i=1;i<=n;i++) printf("%d\n",Max[i].val);
}
}