FZU 星系碰撞 最大獨立集 匈牙利演算法

2021-07-02 07:15:35 字數 1540 閱讀 7463

problem 2194 星系碰撞

據**,大約在100億年後,獅子座星系將與銀河系發生碰撞,兩個星系的碰撞將會合併兩個星系,但是沒有2個星球會相撞。現在某科學家得到兩個星系合併後的結果,一些二維平面上的點,但是不知道那些星球屬於銀河系,已知如果兩個星球屬於同乙個星系,那麼他們之間的距離大於5光年,這邊的距離指的是歐幾里得距離,即(x1,y1)與(x2,y2)的距離為sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))。現在想請你幫忙把合併後的結果分成2個集合,乙個屬於銀河系,乙個屬於獅子座星系,由於集合劃分的方案可能有多種,現在想知道最多有多少個星球可能屬於銀河系。(可以所有星球都屬於銀河系)

例如:如下圖有6個點,你可以有以下4中劃分, }; , }; , }; , } ,那麼可以採用第一種劃分 都屬於銀河系,答案為4.

包含多組資料每組資料輸入第一行 乙個整數n 表示星球個數(1<=n<=50000),接下去n 行 每行2個整數 x和y 表示星球的座標(1<=x,y<=500000),沒有重合的點。

輸出一行乙個整數表示最多有多少個星球屬於銀河系。如果沒辦法進行劃分那麼輸出-1。

61 39 111 75 713 54 4

4

#include #include #include #include #include #include #include #include #include #include #include #define inf 100000000

using namespace std;

struct node

};node a[50005];

vectorvec[50005];

int cx[50005];

int cy[50005];

int visit[50005];

int n;

int path(int u)

} }return 0;

}int color[50005];

int flag;

int maxmatch(int u)

que.push(v);

}else

}}

} int cc = va.size();

int res = 0;

for(int i = 0;i < cc;i++)

} return res;

}int d(int i,int j)

int main()

sort(a,a+n);

for(int i = 0;i < n;i++)

}}

int tm = 0;

memset(cx,-1,sizeof(cx));

memset(cy,-1,sizeof(cy));

memset(color,-1,sizeof(color));

flag = 0;

for(int i = 0;i < n && !flag;i++)

} if(flag)

else

} return 0;

}

樹的最大獨立集

include include includeusing namespace std ifstream fin c data19.in struct node int data int c int gc struct node parent struct node left struct node ...

樹的最大獨立集

題意 對於一棵有n個結點的無根樹,選出盡量多的結點,使得任何兩個結點均不相鄰 稱為最大獨立集 sol 樹形dp 由於每個點只由其兒子或者孫子決定 二者的最大值 所以我們可以深搜一遍,回溯的時候用當前節點更新其父親以及父親的父親 因為此時該節點的值已經被我們計算出來了 這種由已知貢獻給未知的方法稱為刷...

hdu 2768 最大獨立集

建圖很巧妙嗎,把每個孩子拆點,將有矛盾的兩個孩子之間連一條邊,當然還有反向邊,求出最大匹配 2 以為前面拆點且有反向邊所以求出最大匹配要除以2,然後用總人數減去即可 include include include define inf 0x3f3f3f3f define bug printf her...