這又是一道坑題!
思想進行了大幅轉變,並查集炸了之後終於搞出了一種奇葩的演算法,終於卡時間a了。
把思路按順序理一理。
先把邊從大到小排序一下。
<1> 看完題目,我去這不是並查集模板麼嗎,馬上敲了個裸並查集,判斷兩個點如果之前已經聯通了,直接退出輸出當前值即可。
code(wa)
#include#includeusing
namespace
std;
const
int n=20005,m=100005
;struct
data
e[n];
intfather[n],i,n,m;
inline
void read(int &x)
inline
int comp(data a,data b)
inline
int getfather(int k)
intmain()
printf("%d
",e[i].s);
return0;
}
帥氣得搞了50分·。
然後就是一道帶權並查集的模板題了(可是我不會)
不過可以用補集的做法來搞
開兩倍的陣列,每次連邊的時候把x和y+n相連,y和x+n相連。這樣如果兩個點的父節點相同那麼它們之間的距離肯定是偶數。
code(tle)
#include#includeusing
namespace
std;
const
int n=20005,m=100005
;struct
data
e[n];
int father[n*2
],i,n,m;
inline
void read(int &x)
inline
int comp(data a,data b)
inline
int getfather(int k)
intmain()
father[fx]=getfather(e[i].r+n);
father[fy]=getfather(e[i].l+n);
}puts("0
");return0;
}
然後蜜汁tle了4個點
<3> 終於,發現了一種神奇的演算法。因為已經對邊長排過序,並且稍微想一想就可以得出如果到這一條邊不能滿足要求,那麼所有比它小的邊絕對也滿足不了。
於是——二分。
對於二分出來的邊長,只保留比它長的邊,再跑一遍染色即可。
所謂染色,就是把乙個點染上一種顏色(例如1),再把與它相鄰的點染上另一種顏色即可(例如2)。
如果發現乙個點與之相連的點顏色和它一樣,說明不可行,return 掉即可。
bfs實現玄學複雜度,常數小的應該能卡過去
code(ac)
#include#include#include
#include
using
namespace
std;
const
int n=20005,m=100005
;vector
a[n],l[n];
int n,m,i,j,ans,col[n],q[n*2+10
],e[m],x,y;
inline
void read(int &x)
inline
int comp(int a,int b)
inline
bool check(int
x) else
if (col[k]==col[now]) return0;}}
}}
return1;
}int
main()
sort(e+1,e+m+1
,comp);
int l=1,r=m+1
;
while (l<=r)
printf("%d
",e[ans]);
return0;
}
luogu P1525 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...
luoguP1525關押罪犯
解決方案 1.按照衝突從大到小排序 2.優先保證最大衝突不發生 對,所以是貪心 3.開乙個並查集,維護必須在同乙個監獄中和必須不在同乙個監獄中的罪犯 4.等等,兩個並查集 5.所以要有2倍的人 6.x變成x和x n 7.x y n x和y必須不在一起 8.x y x和y必須在一起 9.開始處理 10...
P1525 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...