hdu5727 Necklace 列舉 匈牙利

2021-07-15 06:59:49 字數 1510 閱讀 7038

題意:

有2n(0<=n<=9)個珠子,分成陰陽兩極,每極各n個。

用這2n個珠子做成乙個項鍊,使得相鄰兩個珠子的極性是不一樣的,因為有一些陽性的珠子會被一些陰性的珠子所削弱在它們它們相鄰的情況下。

給你m(0<=m<=n*(n-1)/2)個關係[x,y]表示陽性珠子x會被陰性珠子y在相鄰情況下所削弱。問你最少有多少個陽性被削弱。

題解:

我們可以先暴力列舉出所有陰性珠子的排列情況(因為是環,所以有(n-1)!種),然後在它們之間插入陽性的珠子,判斷出陽性珠子插入在之間會不會被削弱。我們通過匈牙利演算法算出最大匹配sum,然後算出n-sum,對於每種排列取最小值就得到了我們想要的答案,注意特判下n=0的情況。

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pb push_back

#define pa pair#define clr(a,b) memset(a,b,sizeof(a))

#define lson lr<<1,l,mid

#define rson lr<<1|1,mid+1,r

#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)

#define key_value ch[ch[root][1]][0]

#pragma comment(linker, "/stack:102400000000,102400000000")

const ll mod = 1000000007;

const int n = 20;

const int maxn = 1e5+15;

const int letter = 130;

const ll inf = 1e18;

const double pi=acos(-1.0);

const double eps=1e-10;

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m;

int mp[n][n],vis[n],mark[n],pos[n],f[n][n];

bool dfs(int x)}}

return false;

}void solve()

}int sum=0;

for(int i=1;i<=n;i++)

ans=min(ans,n-sum);

}while(next_permutation(pos+2,pos+n+1));

printf("%d\n",ans);

}int main()

clr(mp,0);

int x,y;

for(int i=0;i

HDU 5727 Necklace(二分匹配)

傳送門 題意 n個陽點和n個陰點,要拼成乙個項鍊,而且陽和陰必須相鄰,每個陽的兩邊都是陰,每個陰的兩邊都是陽。然後給你m條邊,每條邊包括乙個編號為a的陽點,和編號為b的陰點,表示這兩個如果相鄰的話,這個陽點就會變得憂鬱。問你最少幾個陽點會變憂鬱。思路 最少幾個會變的憂鬱,那麼就是n 最大幾個正常的陽...

Hdu 3874 Necklace 樹狀陣列

題意 詢問某一區間的值之和,相同元素只算一次 思路,樹狀陣列求解,由於區間相同元素只算一次,採用離線演算法,把區間右端點從小到大排序,按順序處理。首先我們找到乙個點時,記錄它的下標,若在後面還有與它相同的元素,我們把之前的元素去掉,插入到當前位置,每次進行這樣的一次處理,就要判斷一下,處理後該點有沒...

HDU 3474 Necklace 單調佇列

一串項鍊由c和j組成,可以從某乙個位置切斷,從左或者往右收集,問有多少種合法的切割方案,滿足任意時刻c的數量不小於j的數量。單調佇列維護最小值。include include include include using namespace std const int maxn 2000010 cha...