日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1944 - Fiber Communications

發布時間:2025/5/22 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1944 - Fiber Communications 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原題地址:http://poj.org/problem?id=1944?

題目大意:有n個點排成一圈,可以連接任意兩個相鄰的點,給出 p 對點,要求這 p 對點必須直接或間接相連,求最少的連接邊數

數據范圍:n <= 1000, p <= 10000

算法分析:

一開始當最小生成樹做的,才發現自己 SB 了……

先考慮不是環形而是線形的結構,直接貪心連接每兩個點之間的所有點就好了。這樣我們可以枚舉環形的斷點,然后逐次貪心,求最小解即可

很多同學在貪心的時候應用了線段樹是復雜度高達O(np log n),其實絲毫沒有必要,我們只需要每次斷點時生成一個數組,在每對點的左邊點處加1,再在右邊點處減1,然后求一下部分和,部分和中正數的個數即為所求(詳見代碼)

參考代碼:

1 //date 20140205 2 #include <cstdio> 3 #include <cstring> 4 5 const int maxn = 1005; 6 const int maxp = 10005; 7 const int INF = 0x7F7F7F7F; 8 9 inline void swap(int &a, int &b){int x = a; a = b; b = x;} 10 inline int min(int a, int b){return a < b ? a : b;} 11 12 int n, p; 13 int pa[maxp][2]; 14 int s[maxn << 1]; 15 16 int main() 17 { 18 scanf("%d%d", &n, &p); 19 for(int i = 1; i <= p; ++i) 20 { 21 scanf("%d%d", &pa[i][0], &pa[i][1]); 22 if(pa[i][0] > pa[i][1])swap(pa[i][0], pa[i][1]); 23 } 24 25 int ans = INF; 26 for(int i = 1; i <= n; ++i) 27 { 28 memset(s, 0, sizeof s); 29 for(int j = 1; j <= p; ++j) 30 { 31 int x = pa[j][0], y = pa[j][1]; 32 if(x <= i)x += n; 33 if(y <= i)y += n; 34 if(x > y)swap(x, y); 35 ++s[x]; --s[y]; 36 } 37 int now = 0, res = 0; 38 for(int j = 1; j <= n; ++j) 39 { 40 now += s[i + j]; 41 if(now > 0)++res; 42 } 43 ans = min(ans, res); 44 } 45 printf("%d\n", ans); 46 return 0; 47 }

?

轉載于:https://www.cnblogs.com/w007878/p/3538406.html

總結

以上是生活随笔為你收集整理的POJ 1944 - Fiber Communications的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。