1. 程式人生 > >[SCOI2010]連續攻擊遊戲 匈牙利演算法

[SCOI2010]連續攻擊遊戲 匈牙利演算法

覺得題目水的離開
不會匈牙利的請離開
不知道二分圖的請離開
不屑的大佬請離開
…….
感謝您貢獻的訪問量

————————————華麗的分割線————————————
扯淡完了,先重溫一下題目

[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
說明

Limitation

對於30%的資料,保證N < =1000

對於100%的資料,保證N < =1000000

表示沒想不會·並查集的做法

作為一個剛剛學完匈牙利演算法的蒟蒻,大佬如果覺得寫的不好或程式碼太醜請見諒。
這個題顯然可以用二分圖做,把裝備兩個屬性分別減一作為兩個點向該裝備連一條邊最後從零開始跑匈牙利,跑到匹配不了為止,這時就可以求出想要的答案

注意到

n<=1000000

為防止TLE 可以使用鏈式前向星存邊,用時間戳優化每次對vis的memset即可

程式碼如下

# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
# define N 1000001
# define M 2000001
# define ll long long
# define RG register
# define IL inline
# define UN unsigned
# define mem(a, b) memset(a, b, sizeof(a))
# define min(a, b) ((a) < (b)) ? (a) : (b) # define max(a, b) ((a) > (b)) ? (a) : (b) using namespace std; int n, m, ft[N], nt[M], to[M], cnt, girl[N], vis[N], id; IL ll Get(){ char c = '!'; ll z = 1, num = 0; while(c != '-' && (c < '0' || c > '9')) c = getchar(); if(c == '-') z = -1, c = getchar(); while(c >= '0' && c <= '9') num = num * 10 + c - '0', c = getchar(); return num * z; } IL int Dfs(RG int u){ for(RG int i = ft[u]; i != -1; i = nt[i]){ RG int v = to[i]; if(vis[v] != id){ vis[v] = id; if(girl[v] == -1 || Dfs(girl[v])){ girl[v] = u; return 1; } } } return 0; } IL int Hungarian(){ RG int ans = 0; for(RG int i = 0; i <= m; i++){ id++; if(Dfs(i)) ans++; else return ans; } return ans; } IL void Add(RG int u, RG int v){ to[cnt] = v; nt[cnt] = ft[u]; ft[u] = cnt++; } int main(){ mem(girl, -1); mem(ft, -1); n = Get(); for(RG int i = 1; i <= n; i++){ RG int a = Get(), b = Get(); Add(a - 1, i); Add(b - 1, i); m = max(m, a - 1); m = max(m, b - 1); } printf("%d\n", Hungarian()); return 0; }

本人小蒟蒻一個,不起眼的部落格,大佬們見笑了。。。

相關推薦

[SCOI2010]連續攻擊遊戲 匈牙利演算法

覺得題目水的離開 不會匈牙利的請離開 不知道二分圖的請離開 不屑的大佬請離開 ……. 感謝您貢獻的訪問量 ————————————華麗的分割線———————————— 扯淡完了,先重溫一下題目 [SCOI2010]連續攻擊遊戲 題目描

並查集 洛谷P1640 [SCOI2010]連續攻擊遊戲

return main blog scoi2010 clu amp std 來源 多少 [SCOI2010]連續攻擊遊戲 題目描述 lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝

[Luogu 1640] SCOI2010 連續攻擊遊戲

con 輸出 ges clu using std code size oid [Luogu 1640] SCOI2010 連續攻擊遊戲 <題目鏈接> DP太惡心,回來二分圖這邊放松一下心智。 這個建圖真的是難以想到。 因為要遞增啊,屬性值放x部,裝備放y部,對

[luogu1640 SCOI2010]連續攻擊遊戲 (二分圖匹配)

() oss ring ems put printf class names 表示 [傳送門] (https://www.luogu.org/problemnew/show/P1640) Description lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每

P1640 [SCOI2010]連續攻擊遊戲

|| har i++ break con assert pac std bre 做了這麽長時間的二分圖, 終於發現一個只能用Hungary做的題了. 一眼二分圖, 但是建模非常巧妙. 一開始的想法無非就是把兩個屬性當做二分圖的兩邊, 但是發現這樣似乎不好處理選其中一個的情況

洛谷——P1640 [SCOI2010]連續攻擊遊戲

bre i++ else 最大匹配 scanf 使用 終極 一個 add P1640 [SCOI2010]連續攻擊遊戲 題目描述 lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使

洛谷P1640 [SCOI2010]連續攻擊遊戲

每件物品只能選一次,每個屬性只能選一次 這不是明顯附合二分圖匹配中兩邊的點的性質嘛 將裝備和屬性連邊,從屬性為1的點開始匹配,不能匹配就輸出答案 PS.這題可以用並查集實現 #include<c

[SCOI2010]連續攻擊遊戲

edge set rap long long 傳送門 min register getc def 題目傳送門 這道題是一個二分圖匹配問題。如果第$i$件裝備的屬性值為$j$,將裝備$i$連邊到屬性值$j$(註意裝備結點$≠$屬性值結點)。 然後從$1$到$1000

【洛谷1640】[SCOI2010]連續攻擊遊戲

題目描述 lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每種裝備最多隻能使用一次。遊戲進行到最後,lxhgww遇到了終極bo

洛谷1640 [SCOI2010]連續攻擊遊戲

標籤:並查集 題目 題目傳送門 題目描述 lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每種裝備最多隻能使用一

P1640 [SCOI2010]連續攻擊遊戲 二分圖構造

遊戲 lin 割點 www int line emp 題意 序列 https://www.luogu.org/problemnew/show/P1640 題意 lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10

[SCOI2010] 連續攻擊遊戲

題目描述: 霧。 題目分析: 二分圖匹配,逼著你寫匈牙利。 題目連結: Ac 程式碼: #include <cstdio> #include <iost

SCOI2010連續攻擊遊戲「並查集」

題目傳送門 題解 巧妙的並查集做法。 把每個裝備的兩個屬性 a , b

[HNOI2006]超級英雄Hero [Scoi2010]遊戲 匈牙利演算法 解題報告

這兩道題是極為類似的,只是一道 n <1001,另一道 n <10000 好像區別不大 你有n個物品,每個物品有兩個值且每個物品只能使用一次,每次使用可以選擇它的其中一個值。 提問:使用一些物品後,能取到的最大的連續值是多少? 以

【二分圖】洛谷P1640連續攻擊遊戲

接下來 真的是 str style 並且 一行 include can div 題目描述 lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每

[SCOI2010] 連續攻擊問題

edge 擁有 攻擊力 裝備 2個 很多 個數字 釋放 names 題目 Description lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性

luogu 1640 連續攻擊遊戲

har sizeof main 二分圖匹配 include 二分 getch div insert 二分圖匹配,將需要進行的編號(1-10000)和物件進行匹配,而非編號之間,編號對應物品 #include<bits/stdc++.h> using names

洛谷P1640 連續攻擊遊戲+二分圖匹配

本題是個二分圖匹配問題。首先我們來複習一下匈牙利演算法:用臨接矩陣寫的匈牙利:Code:(洛谷P3386) #include<iostream> #include<algorithm> #include<cstdio> #include<cstring>

連續攻擊遊戲[最大匹配]

傳送門 我們將屬性向武器建邊,匈牙利跑最大匹配就可以了 #include<bits/stdc++.h> #define N 1000005 #define M 10005 using namespace std; int n,ans,vis[N],match[

棋盤遊戲 HDU - 1281 (匈牙利演算法

小希和Gardon在玩一個遊戲:對一個N*M的棋盤,在格子裡放盡量多的一些國際象棋裡面的“車”,並且使得他們不能互相攻擊,這當然很簡單,但是Gardon限制了只有某些格子才可以放,小希還是很輕鬆的解決了這個問題(見下圖)注意不能放車的地方不影響車的互相攻擊。  所以現在Gardon想讓小希