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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj 237

發布時間:2025/3/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj 237 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

游戲高手的煩惱

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:5 描述

有一位傳說級游戲高手,在閑暇時間里玩起了一個小游戲,游戲中,一個n*n的方塊形區域里有許多敵人,玩家可以使用炸彈炸掉某一行或者某一列的所有敵人。他是種玩什么游戲都想玩得很優秀的人,所以,他決定,使用盡可能少的炸彈炸掉所有的敵人。

現在給你一個游戲的狀態,請你幫助他判斷最少需要多少個炸彈才能炸掉所有的敵人吧。

比如說,下圖中X表示敵人

X . X?
. X .?

. X .?

則,他只需要炸掉第1行與第2列就能炸掉所有的敵人,所以只需要兩顆炸彈就可以了。

輸入
第一行是一個整數T,表示測試數據的組數(0<T<=400)。
每組測試數據的第一行有兩個整數n,K,其中n表示游戲方形區域的大小。(n<=500,K<=10 000)
隨后的K行,每行有兩個整數i,j表示第i行,第j列有一個敵人(行和列都從1開始編號)。(1<=i,j<=n)
輸出
對于每組測試數據,輸出一個整數表示最少需要的炸彈顆數
樣例輸入
1 3 4 1 1 1 3 2 2 3 2
樣例輸出

2


解題思路:這道題目難在建圖,很難將它與二分圖聯系在一起。。實際上只要是橫坐標相同或者縱坐標相同,只需要一個炸彈就能搞定,如果敏感的話就能夠分析它要求的是二分圖的最小點覆蓋。。分成兩個集合X,Y(所有敵人的橫坐標在X,縱坐標在Y),假定x0分別與y1,y2,y3連接了一條邊,那么可以清楚的知道,(x0,y1),(x0,y2),(x0,y3)這三個敵人只需要一個炸彈即可。。。換句話說,我只要找到一個點就可以把與之相關聯的邊都覆蓋掉。。。圖論的題目最困難的還是在建圖

AC:

#include <stdio.h> #include <string.h>const int N = 505; const int M = 10005;struct Vertex {int head; }V[N];struct Edge {int v,next; }E[M];int top,match[N];bool used[N];void Init() {top = 0;memset(V,-1,sizeof(V));memset(match,0,sizeof(match)); }void Add_Edge(int u,int v) {E[top].v = v;E[top].next = V[u].head;V[u].head = top++; }bool dfs(int u) {for(int i=V[u].head;~i;i=E[i].next){int v = E[i].v;if(!used[v]){used[v] = true;if(!match[v] || dfs(match[v])){match[v] = u;return true;}}}return false; }int maxMatch(int n) {int ans = 0;for(int i=1;i<=n;i++){memset(used,false,sizeof(used));if(dfs(i))++ans;}return ans; }int main() {int z,n,m,num;scanf("%d",&z);while(z--){Init();scanf("%d%d",&n,&m);while(m--){int i,j;scanf("%d%d",&i,&j);Add_Edge(i,j);}printf("%d\n",maxMatch(n));}return 0; }

總結

以上是生活随笔為你收集整理的nyoj 237的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。