P1640 [SCOI2010]連續攻擊遊戲
阿新 • • 發佈:2021-07-10
[SCOI2010]連續攻擊遊戲
題目描述
lxhgww 最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有 $2$ 個屬性,這些屬性的值用 $[1,10000]$ 之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每種裝備最多隻能使用一次。遊戲進行到最後,lxhgww 遇到了終極 boss,這個終極 boss 很奇怪,攻擊他的裝備所使用的屬性值必須從 $1$ 開始連續遞增地攻擊,才能對 boss 產生傷害。也就是說一開始的時候,lxhgww 只能使用某個屬性值為 $1$ 的裝備攻擊 boss,然後只能使用某個屬性值為 $2$ 的裝備攻擊 boss,然後只能使用某個屬性值為 $3$ 的裝備攻擊 boss……以此類推。現在 lxhgww 想知道他最多能連續攻擊 boss 多少次?輸入輸出格式
輸入格式
輸入的第一行是一個整數 $N$,表示 lxhgww 擁有 $N$ 種裝備接下來 $N$ 行,是對這 $N$ 種裝備的描述,每行 $2$ 個數字,表示第 $i$ 種裝備的 $2$ 個屬性值。輸出格式
輸出一行,包括 $1$ 個數字,表示 lxhgww 最多能連續攻擊的次數。輸入輸出樣例
輸入樣例 #1
3
1 2
3 2
4 5
輸出樣例 #1
2
說明
對於 $30\%$ 的資料,保證 $N \le 10^3$。 對於 $100\%$ 的資料,保證 $N \le 10^6$。1 #include <cstdio> 2 #include <cstring> 3#include <algorithm> 4 5 using namespace std; 6 const int N = 2 * 1e6 + 10; 7 8 int e[N], w[N], ne[N], h[N] , idx; 9 int n; 10 int vis[N]; 11 int match[N]; 12 void add(int a,int b) 13 { 14 e[idx] = b; ne[idx] = h[a]; h[a] = idx++; 15 } 16 int now; 17 18 bool dfs(int x) 19 { 20 for(int i = h[x]; ~i ; i = ne[i]) 21 { 22 int j = e[i]; 23 if(vis[j] != now) 24 { 25 vis[j] = now; 26 if(match[j] == 0 || dfs(match[j])) 27 { 28 match[j] = x; 29 return 1; 30 } 31 } 32 } 33 return 0; 34 } 35 36 int main() 37 { 38 scanf("%d",&n); 39 memset(h, -1, sizeof h); 40 for(int i = 1; i <= n; i++) 41 { 42 int a, b; 43 scanf("%d %d",&a,&b); 44 add(a, i); add(b, i); 45 } 46 int res = 0; 47 for(int i = 1; i <= n; i++) 48 { 49 now++; 50 if(!dfs(i)) 51 { 52 printf("%d", i - 1); 53 return 0; 54 } 55 } 56 printf("%d",n); 57 return 0; 58 }