time limit: 10 sec memory limit: 64 mb
submit: 2363 solved: 1092
僅包含乙個整數,表示可以獲得的最大能源收入。注意,你也可以選擇不進行任何攻擊,這樣能源收入為0。
3 210 0
20 0
-10 0
-5 1 0 0
100 1 2 1
100 0
25在樣例中, 植物p1,1可以攻擊位置(0,0), p2, 0可以攻擊位置(2,1)。
乙個方案為,首先進攻p1,1, p0,1,此時可以攻擊p0,0 。共得到能源收益為(-5)+20+10 = 25。注意, 位置(2,1)被植物p2,0保護,所以無法攻擊第2行中的任何植物。
【大致資料規模】
約20%的資料滿足1 ≤ n, m ≤ 5;
約40%的資料滿足1 ≤ n, m ≤ 10;
約100%的資料滿足1 ≤ n ≤ 20,1 ≤ m ≤ 30,-10000 ≤ score ≤ 10000 。
網路流+拓撲排序
因為植物可能會互相保護而形成環,所以先用拓撲排序排除環,求出圖中的閉合子圖。
然後按照先吃右邊才能吃左邊的關係,從每個點向它左邊一格的點連邊,容量為inf
保護型的植物向它保護的植物連邊,容量為inf。
吃植物能獲得收益時,該植物向匯點連邊,容量為收益。
吃植物需要代價時,源點向該植物連邊,容量為代價的絕對值。
答案=可能獲得的收益總和-最小割。
1/*by silvern
*/2 #include3 #include4 #include5 #include6 #include7 #include8 #include9
using
namespace
std;
10const
int mx[5]=;
11const
int my[5]=;
12const
int inf=1e9;
13const
int mxn=2010;14
intread()
17while(ch>='
0' && ch<='9')
18return x*f;19}
20struct
edgee[mxn*500
];23
int hd[mxn],mct=1;24
void add_edge(int u,int v,int
f)27
void insert(int u,int v,int
f)30 vectoreg[mxn];
31int
n,m,s,t;
32int
d[mxn];
33bool
bfs()46}
47}48return
d[t];49}
50int dfs(int u,int
lim)60}
61 d[u]=0;62
return
f;63}64
intdinic()
69int id[50][50],cnt=0
,ed;
70void
init()
77int
sc[mxn];
78int
ind[mxn];
79int st[mxn],top=0;80
bool
vis[mxn];
81void topo()
92else insert(s,u,-sc[u]);//
需要付出的代價
93for(j=0;j)99}
100for(i=1;i<=n;i++)
101for(j=2;j<=m;j++)
105}
106 res=res-dinic();
107 printf("
%d\n
",res);
108}
109int
main()
123if(j>1)
127}
128}
129topo();
130return0;
131 }
bzoj1565 NOI2009 植物大戰殭屍
傳送門 這道題吃到某個植物a可能需要先吃掉別的植物b 在他的右邊或者保護著他 那麼我們把a連向b。發現這是最大權閉合子圖。顯然是可以通過網路流水過的。閉合子圖 v中頂點的所有出邊均指向v內部頂點 那麼按照最大權閉合圖的建圖方法 1.s向正權點連流量為權值的邊 2.負權點向t連流量為權值的絕對值的邊 ...
BZOJ1565 NOI2009 植物大戰殭屍
好久沒寫部落格了 題目在這裡 沒什麼好說的 應該很容易看出是最大閉合子圖吧?不過要注意一下的是,這題可能有植物是不可能被擊潰的,所以要先跑一遍拓撲排序把這些點排除掉 include include include include include include include include usi...
BZOJ1565 NOI2009 植物大戰殭屍
problem plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和zombies 殭屍 是遊戲的主角,其中plants防守,而zombies進攻。該款遊戲包含多種不同的挑戰系列,比如protect your brain bowling等等。其中最為經典的,...