題意:
告訴n個人,m對關係,每隊關係價值c,通過分配n個人到兩個監獄,來使得同乙個監獄內的最**值最小。
題解:
通過並查集維護乙個分配。
怎麼分配呢,從大到小排序價值,優先把較大的都分到不同監獄,直到出現第乙個矛盾直接輸出。
分到不同監獄=將敵人的敵人和自己分到乙個監獄,但是敵人的敵人遍歷容易超時,而且還要特殊記錄。
前1~n和n+1~2n分別表示同乙個監獄。a和b+n在同乙個集合內表示的意思就是a和b不在乙個監獄,a和b在乙個集合內表示的意思是在乙個監獄。通過前者這樣的維護關係,可以極大地簡化複雜度。
#include#define for(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
const int maxn = 200010;
int n,m;
struct nodea[maxn];
int cmp(node a,node b)
struct unionset
}unionset(){}
void uni(int x, int y)
bool query(int x, int y)
int find(int x)
} us;
int main()
us=unionset(2*n);
sort(a+1,a+1+m,cmp);
bool ok = false;
for(i,1,m)
else
} if(!ok)puts("0");
}
洛谷P1525 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...
洛谷 P1525 關押罪犯
拿到這題看都沒看直接寫了個裸地貪心 並查集 寫完就發現一點問題 include include include include include using namespace std int n,m,g 40010 struct pi pe 100010 bool cmp pi aa,pi bb i...
洛谷P1525 關押罪犯
ss 城現有兩座監獄,一共關押著 nn 名罪犯,編號分別為 1 n1 n 他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 cc 的罪犯被...