並查集第一道非模版題。。。
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1~n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c 的衝突事件。
每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。
在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。
那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?
看完題,首先想到了圖,最短路。。。果然我還是很弱。。。
其實,題目要求算最小值,我們為了保證值最小,就要把值大的邊廢掉(不然它就是衝突值啦),那麼可以想到,我們可以排序並往後列舉(聽說有的大佬用二分,沒試過),如果有一條邊不合理,那麼它就是答案(小貪心)
難點是,如何判斷。
可以想到用並查集。合併方法:敵人的敵人就是朋友(即我和敵人的敵人在乙個監獄)。
為了實現操作,要假設有2*n個點,並合併兩次哦!
#include#include#include#includeusing namespace std;
int n,m,k,l,num,ans,fa[100005],num1,num2,flag;
struct wff[100005];
bool judge(wf x,wf y)
int getfa(int x)
bool search(int x,int y)
int main()
k=getfa(f[i].a+n);
l=getfa(f[i].b);
fa[k]=l;
k=getfa(f[i].a);
l=getfa(f[i].b+n);
fa[k]=l;
} printf("0");
//while(1);
return 0;
}
Solution洛谷1525關押罪犯
題面描述 s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...
2019 7 17 洛谷 1525 關押罪犯
關押罪犯 並查集先對怒氣值排序 然後一對一對遍歷 如果二者父親相同 那就是無法避免的最大衝突 如果不同 則判斷二者是否已經有必定不能在乙個監獄的物件 若有則讓那個物件的父親變成對手的父親 因為對手必定和物件在同一監獄 若沒有則讓這個物件變成對手 因為對手不能和他在乙個監獄 我又在sort裡的m還是n...
洛谷P1525 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...