日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[POJ1463] Strategic game

發(fā)布時(shí)間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [POJ1463] Strategic game 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:

傳送門

題目大意:

Bob非常享受玩電腦游戲的過(guò)程,尤其是策略游戲,但是在有些時(shí)候,他因?yàn)椴荒茉诘谝粫r(shí)間找到最佳的策略而十分傷心。 現(xiàn)在,他遇到了一個(gè)問(wèn)題。他必須保衛(wèi)一個(gè)中世紀(jì)的城市,有很多道路將整個(gè)城市連起來(lái),整體上看上去像一棵樹。Bob需要放置盡可能少的士兵,保衛(wèi)樹上所有的邊。士兵只能放在節(jié)點(diǎn)上,但是卻可以保衛(wèi)所有與這個(gè)節(jié)點(diǎn)相鄰的邊。

題目分析:

由于樹本身具有二分圖的性質(zhì),所以這里我把樹手動(dòng)染色轉(zhuǎn)成二分圖,然后跑最小點(diǎn)覆蓋
(當(dāng)然也可以樹形dp)

代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N (1500 + 5) using namespace std; inline int read(){int cnt = 0, f = 1; char c;c = getchar();while (!isdigit(c)) {if(c == '-') f = -f;c = getchar();}while (isdigit(c)) {cnt = cnt * 10 + c - '0';c = getchar();}return cnt * f; } int n, nxt[2*N], to[2*N], first[2*N], tot, x, t, y, Float[N], cnt, black, white, ans, match[N]; bool vis[N]; struct node{int x;int y; }edge[N]; void add(int x, int y) {nxt[++tot] = first[x];first[x] = tot;to[tot] = y; } void Dfs(int u){for (register int i = first[u]; i; i = nxt[i]) {int v = to[i];if(!Float[v]) {Float[v] = Float[u] + 1;Dfs(v);}} } void build_map() {memset (first, 0, sizeof(first));memset (nxt, 0, sizeof(nxt));memset (to, 0, sizeof(to));tot = 0;for (register int i = 1; i <= cnt; i++) {int X = edge[i].x; int Y = edge[i].y;if (Float[X] % 2 == 1) {add(X, Y);if (!vis[X]) {vis[X] = true;black++;}if (!vis[Y]) {vis[Y] = true;white++;}} else {add(Y, X);if (!vis[X]) {vis[X] = true;white++;}if (!vis[Y]) {vis[Y] = true;black++;}}} } int find(int u) { // cout<<u<<"##"<<endl;for (register int i = first[u]; i; i = nxt[i]) {int v = to[i]; // cout<<vis[v]<<" "<<v<<endl;if (vis[v]) {continue; } else {vis[v] = true;if (match[v] == -1||find(match[v])) {match[v] = u;return 1;}}}return 0; }int hungary() {for (register int i = 1; i <= n; i++) match[i] = -1;for (register int i = 1; i <= n; i++) {for (register int j = 1; j <= n; j++) vis[j] = 0;ans += find(i);}return ans; }int main(){while(scanf("%d", &n) != EOF) {memset(first, 0, sizeof(first));memset(nxt, 0, sizeof(nxt));memset(to, 0, sizeof(to));memset(Float, 0, sizeof(Float));memset(vis, 0, sizeof(vis));tot=0; cnt=0; ans=0;for (register int i = 1; i <= n; i++) {x = read();t = read();for (register int j = 1; j <= t; j++) {y = read();edge[++cnt].x = x+1;edge[cnt].y = y+1;add(x+1,y+1);add(y+1,x+1);}}Float[1] = 1;Dfs(1);build_map(); // cout<<black<<" "<<white<<endl; // for(register int i = 1; i <= n; i++) cout<<Float[i];int res = hungary();printf("%d\n", res);}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/kma093/p/10540883.html

總結(jié)

以上是生活随笔為你收集整理的[POJ1463] Strategic game的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。