入門:java
題意:杭電1520spa
先輸入n我的,接下來n行輸入他們的快樂值,再接下來輸入一些數對<a,b>,表示b是a的上司(別看反了)!code
要求直屬上司和員工不能同時出席宴會,求宴會最大的快樂值。blog
import java.util.*; public class Main8 { static Vector<int[]>v=new Vector<int[]>(); static int par[]=new int[6001]; static int son[]=new int[6001]; static int dp[][]=new int[6001][2]; static int vis[]=new int[6001]; static int n; public static void dfs(int root){ vis[root]=1; for(int i=1;i<=n;i++){ if(vis[i]==0&&par[i]==root){ dfs(i); dp[root][1]+=dp[i][0]; dp[root][0]+=Math.max(dp[i][0], dp[i][1]); } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); int a ,b; for(int i=1;i<=n;i++) dp[i][1]=sc.nextInt(); while(true){ a= sc.nextInt(); b = sc.nextInt(); if(a==0&&b==0) break; son[a]++; par[a]=b; } for(int i=1;i<=n;i++){ if(son[i]==0){ a=i; //找到根節點 break; } } dfs(a); System.out.println(Math.max(dp[a][0], dp[a][1])); } }