b最大團(clique.pas/c/cpp)
tl:3s ml:512mb
【description】
給定二維座標上的n個點,如果兩個點之間的距離大於k,則他們不能同時被選取。
求最大團的大小。也即,選出最多點,使得這些點兩兩之間的距離不大於k。
【input】
多組測試,第一行乙個整數t,表示資料的組數。
之後t組資料,每組資料第一行兩個非負整數n, k。
之後n行,每行兩個整數,表示點的座標。
【output】
共t行,每行乙個整數,表示最大團的大小。
【sample input】
25 20
0 00 2
100 100
100 110
100 12041
0 00 1
1 01 1
【sample output】
【hint】
20%:n <= 20
40%:n<=50
100%
:n<=100,0<=k<=10000,所有輸入座標的絕對值不超過10000。t<=10。
這道題需要的是幾何建模而不是圖論建模,如果你想的是完全圖,那麼恭喜gg。
每次如果列舉兩個點,以k為半徑畫圓,兩圓的交部分中的所有點與兩圓的距離都在k以內,所以我們只需要知道兩圓交部分內的點的距離是否滿足。
我們連線兩圓圓心,分成兩部分,兩部分內的點都不會距離大於k,但是跨連線就有可能,這時候就需要圖論建模了。
二分圖,顯而易見。
我們列舉找出超距離的點加入二分圖內,跑一邊最大匹配,用原來的點數+2-最大匹配數即為這次的答案,取max即可
特判:僅有1個點
ans初值賦為-1即可避免特判。
真的要%想出這個方法的julao,太玄了。
**:
#include using namespace std;
#define ll long long
int read()
while(c>='0' && c<='9')
return sum*f;
}struct p
p[305];
p operator-(p a,p b);}
int dis(p a)
int delta(p a,p b)
int t,n,k,ans,match[305],e[305][305],vis[305],l,r,l[305],r[305];
bool dfs(int now)
} return 0;
}int hungry()
return res;
}int main()
for(int k=1;k<=l;k++)
for(int o=1;o<=r;o++)
e[k][o]=0;
for(int k=1;k<=l;k++)
for(int o=1;o<=r;o++)
if(dis(p[l[k]]-p[r[o]])>k*k)
e[k][o]=1;
ans=max(ans,l+r-hungry());
}printf("%d\n",ans+2);
}}
snoi多校模擬賽 1 16 t2
原題 bzoj2900 time limit 10 sec memory limit 512 mb submit 99 solved 59 submit status discuss tk在虐題的同時,也喜歡玩遊戲。現在,有這樣的乙個遊戲,規則是這樣的 先隨機給出乙個數字n,然後你在操場上把1到n的...
SNOI省選模擬賽 dat1t3 tree
題意 給定一棵n個點 n 1條邊的樹,樹上的第i條邊有權值w i q次詢問,每次詢問為下列兩種操作之一 1 增加乙個點對 x,y。2 查詢第x條邊權值為y時所有點對之間的距離的最大值。題解 還沒完全想清楚,先占個坑,最近來補。下附暫時沒有想清的ac的 include include include ...
NOIP2018校模擬賽 T1 階乘
有n個正整數a i 設它們乘積為p,你可以給p乘上乙個正整數q,使p q剛好為正整數m的階乘,求m的最小值。共兩行。第一行乙個正整數n。第二行n個正整數a i 共一行乙個正整數m。16 看到這個題目描述只有一行我心頭就湧上一股不祥的預感 一般這種題 都比較 那啥 是的,這個題我又寫炸了 好的讓我們來...