城市c是乙個非常繁忙的大都市,城市中的道路十分的擁擠,於是市長決定對其中的道路進行改造。城市c的道路是這樣分布的:城市中有n個交叉路口,有些交叉路口之間有道路相連,兩個交叉路口之間最多有一條道路相連線。這些道路是雙向的,且把所有的交叉路口直接或間接的連線起來了。每條道路都有乙個分值,分值越小表示這個道路越繁忙,越需要進行改造。但是市**的資金有限,市長希望進行改造的道路越少越好,於是他提出下面的要求:
1.改造的那些道路能夠把所有的交叉路口直接或間接的連通起來。
2.在滿足要求1的情況下,改造的道路盡量少。
3.在滿足要求1、2的情況下,改造的那些道路中分值最大的道路分值盡量小。
任務:作為市規劃局的你,應當作出最佳的決策,選擇那些道路應當被修建。
第一行有兩個整數n,m表示城市有n個交叉路口,m條道路。接下來m行是對每條道路的描述,u, v, c表示交叉路口u和v之間有道路相連,分值為c。(1≤n≤300,1≤c≤10000)
兩個整數s, max,表示你選出了幾條道路,分值最大的那條道路的分值是多少。
4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
copy
3 6
copy
每個測試點1s
noi2005四川省選拔賽第二試第3題
這些天都是遇到乙個知識點就記錄下乙個知識點,今天還是在看圖演算法,最小生成樹的kruskal演算法,發現自己還是很菜,這是一道基礎的入門題,就把這題來練練手吧
貼**之前首先回顧一下kruskal的演算法實現方式:
kruskal同樣也是乙個最小生成樹演算法,這個演算法需要用到的東西是並查集,本質還是貪心策略,為什麼要用到並查集呢?
因為這個演算法涉及到連通分量的問題,要判斷連通分量是否在同乙個樹中,需要用到並查集中的find 和same 來判斷
實現過程:首先對儲存邊的權值進行排序,不斷地找到最小的邊然後判斷這條邊連線的兩個節點是否位於同乙個連通分量中,為什麼要判斷是否在同乙個連通分量中呢
因為如果兩個節點在同乙個分量中了,你卻還選擇了這條邊那麼就會產生乙個環了 ,就不符合題意!
不在連通分量中就可以選擇
kruskal的偽**:
kruskal-function(g, w)1 f := 空集合
2 for each 圖 g 中的頂點 v
3 do 將 v 加入森林 f
4 所有的邊(u, v) ∈ e依權重 w 遞增排序
5 for each 邊(u, v) ∈ e
6 do if u 和 v 不在同一棵子樹
7 then f := f ∪
8 將 u 和 v 所在的子樹合併
本題的**:
#include#include#include
#include
using
namespace
std;
const
int n=300
;const
int m=10000+20
;int
pre[n];
struct
node;
intn,m;
node rode[m];
bool
cmp(node a,node b)
void
init()
int find(intx)}
bool same(int x,int
y)
return
true;}
void
kruskal()
if(cnt==n-1) break
; }
printf(
"%d %d\n
",cnt,sum);
}int
main()
kruskal();
}return0;
}
vijos 1190 繁忙的都市
城市c是乙個非常繁忙的大都市,城市中的道路十分的擁擠,於是市長決定對其中的道路進行改造。城市c的道路是這樣分布的 城市中有n個交叉路口,有些交叉路口之間有道路相連,兩個交叉路口之間最多有一條道路相連線。這些道路是雙向的,且把所有的交叉路口直接或間接的連線起來了。每條道路都有乙個分值,分值越小表示這個...
醒過來的都市
人類在進化中.逐步喪失自我,而城市在進化當中,逐步變成一巨大的有機體,不斷長出更多的組織,一般叫樓房,還有血管,一般叫道路或下水道這類的.神經系統逐漸發育,這叫網路.慢慢的形成一智慧型機器,而城市裡的人,變成了它的腦細胞及神經細胞.達到臨界點後,城市終於醒過來了,有了自已的更高層次的智慧型及需求.它...
2455 繁忙的都市
2005年省隊選拔賽四川 時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解城市c是乙個非常繁忙的大都市,城市中的道路十分的擁擠,於是市長決定對其中的道路進行改造。城市c的道路是這樣分布的 城市中有n個交叉路口,有些交叉路口之間有道路相連,兩個交叉路口之間最多有一條道...