BZOJ 1565 植物大戰殭屍

2022-05-09 01:51:08 字數 1689 閱讀 1812

思路:由於植物之間有保護關係:(右邊的植物保護左邊的植物,植物攻擊範圍內的植物都被保護了),因此可以用最大權閉合子圖。

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 ...