思路:由於植物之間有保護關係:(右邊的植物保護左邊的植物,植物攻擊範圍內的植物都被保護了),因此可以用最大權閉合子圖。
1 #include2 #include3 #include4 #include5 #include6#define inf 0x7fffffff
7struct
edgee[500005
];10
int tot,go[500005],first[500005],next[500005],flow[500005
];11
int op[500005],cnt[500005],dis[500005],n,m,mx[20005],all,ru[500005
];12
int id[105][105],w[105][105],s,t,nodes,pd[500005],c[500005
];13
intread()
16while ('0'
<=ch&&ch<='9')
17return t*f;18}
19void insert(int x,int y,int
z)26
void add(int x,int y,int
z)30
int dfs(int x,int
f)42
if (flow[i]) mn=std::min(mn,dis[pur]);43}
44if (sum==0
)else52}
53return
sum;54}
55int
main()70}
71for (int i=1;i<=n;i++)
72for (int j=m;j>1;j--)
73 e[++all].u=id[i][j],e[all].v=id[i][j-1],ru[id[i][j-1]]++;
74for (int i=1;i<=all;i++)
75 insert(e[i].u,e[i].v,0
);76 t=nodes;nodes++;
77int top=0;78
for (int i=1;i<=nodes-1;i++)
79if (ru[i]==0
)80 pd[i]=1,c[++top]=i;
81while (top>0)90
}91} 92 tot=0;93
for (int i=1;i<=nodes;i++)
94 first[i]=0;95
for (int i=1;i<=all;i++)
96if (pd[e[i].u]&&pd[e[i].v])
97add(e[i].u,e[i].v,inf);
98int sum=0; all=0;99
for (int i=1;i<=n;i++)
100for (int j=1;j<=m;j++)
101if
(pd[id[i][j]])
107 nodes=all;
108int ans=0
;109
while (dis[s]dfs(s,inf);
110 printf("
%d\n
",sum-ans);
111 }
bzoj1565 植物大戰殭屍
題目鏈結 如果想消滅掉乙個植物,那麼必須先消滅掉左右能保護這個植物的植物。這就成了最大權閉合子圖的模板題了。有兩個需要注意的地方。第乙個就是,能保護當前植物的植物還有當前植物右面的所有植物。第二個就是,在環裡的植物或者是被在環裡的植物所保護的植物是無法消滅的。所以先拓撲一下,找出所有可能被消滅的植物...
1565植物大戰殭屍
description input output 僅包含乙個整數,表示可以獲得的最大能源收入。注意,你也可以選擇不進行任何攻擊,這樣能源收入為0。sample input 3 210 0 20 0 10 0 5 1 0 0 100 1 2 1 100 0 sample output hint 在樣例...
1565 NOI2009 植物大戰殭屍
題面 很裸的乙個最大權閉合子圖啊。如果依賴關係有環,活著說他的依賴關係和環有關,就把這個點廢掉。然後你就構圖跑最大權閉合子圖就好了 include include include include include using namespace std const int n 23 33 const ...