解決方案:
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 的罪犯被關押在同一監獄,他...