luoguP1525關押罪犯

2021-08-11 07:34:54 字數 1055 閱讀 4700

解決方案:

1.按照衝突從大到小排序

2.優先保證最大衝突不發生(對,所以是貪心)

3.開乙個並查集,維護必須在同乙個監獄中和必須不在同乙個監獄中的罪犯

4.等等,兩個並查集

5.所以要有2倍的人

6.x變成x和x+n

7.x-y+n:x和y必須不在一起

8.x-y:x和y必須在一起

9.開始處理

10.假設目前處理到x和y

11.若在之前的處理中x和y已經被判要在一起

12.輸出即可,return 0

13.若沒有,會發現之前的東西有用了

14.所有和x不在一起的必須和y在一起,所有和y不在一起的必須和x在一起

15.合併一下

16.提交,會發現第乙個點錯了

17.最後要輸出0

18.提交,ac

奉上**

#include

#include

using

namespace

std;

int n,m;

int ans;

int f[40001];

struct edge

h[100001];

bool

cmp(edge x,edge y)

intfind

(int x)

//找祖先,用於合併

void

unite

(int x,int y)

//合併

intmain

() sort(h+1,h+m+1,cmp);

for(int i=n+1;i<=2*n;i++)f[i]=i;

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

if (j==find(h[i].b+n)||k==find(h[i].a+n))continue;

unite(j,k+n);

unite(k,j+n);

}cout

<<0;

return0;}

//似乎很簡單

luogu P1525 關押罪犯

題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...

Luogu P1525 關押罪犯

這又是一道坑題!思想進行了大幅轉變,並查集炸了之後終於搞出了一種奇葩的演算法,終於卡時間a了。把思路按順序理一理。先把邊從大到小排序一下。1 看完題目,我去這不是並查集模板麼嗎,馬上敲了個裸並查集,判斷兩個點如果之前已經聯通了,直接退出輸出當前值即可。code wa include include ...

P1525 關押罪犯

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...