Codevs 1003 電話連線

2021-08-09 10:23:31 字數 1791 閱讀 7466

題目

題解

裸的prim

要用最裸最樸素的鄰接矩陣做法,才能保證輸出的邊正確

因為在堆優化之後,只考慮了權值,選擇那一條邊和鄰接矩陣的做法不一樣

考慮把堆優化中的排序,多加幾個關鍵字

首先是權值

權值相同時,如果拓展的節點(t)不同,在矩陣做法中,拓展節點小的哪乙個

拓展節點(t)也相同時,**節點(s)不同,

在矩陣做法中,拓展 s的被拓展順序小的那乙個(因為相等也不更新啊)

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

}

再加乙個tim表示某條邊的入堆順序,權值和t相同時,優先選擇tim小的(這裡卡一組233)

**

鄰接矩陣

#include

#include

#include

#include

using

namespace

std;

const

int n=150;

int mp[n][n],d[n],a[n];

int ans,cnt,n;

bool used[n];

struct nodeot[n];

void prim(int x)

for(int i=1;i<=n;i++)}}

return ;

}int main()

prim(1);

printf("%d\n",cnt);

for(int i=1;i<=cnt;i++)

printf("%d",ans);

return

0;}

堆優化

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=200+20,m=100000+20;

struct edgee[m<<1],out[n];

struct wkw;

priority_queueq;

long

long ans;

int cnt,n,val,tot,tm;

int next[m],first[n];

bool used[n];

bool

operator

<(wkw a,wkw b)

return a.v>b.v;

}void build(int ff,int tt,int vv);

next[tot]=first[ff];

first[ff]=tot;

return ;

}void prim(int x));

}while(!q.empty()));

}if(u.v==0) continue;

cnt++;

if(u.s0};

else out[cnt]=(edge);

}return ;

}int main()

}prim(1);

printf("%d\n",cnt);

for(int i=1;i<=cnt;i++)

printf("%lld\n",ans);

return

0;}

Code Vs 1003 電話連線

比較水的題目,裸prim.下面 寫得有點麻煩.僅供參考.其實不用寫那麼多記錄.我是蒟蒻.qaq include include include include include include include includeusing namespace std const int m 105 con...

codevs 1003 電話連線

題解 prim 分析 從輸出要求中就可以看出本題是prim演算法求最小生成樹,所以,只需要實現就可以了。那麼,我們來回顧一下prim演算法 1.設有2個集合v1,v2 預設有5個點 2.在圖中找到離當前第乙個點最近的點,我們假設是2,然後用2去鬆弛每一條邊 3.重複第2步直到迴圈n 1次 那麼題目就...

codevs 1003 電話連線

拿到這個題,看到說要用prim演算法,感覺是個模板題,不過好像自己也沒怎麼寫過關於最小生成樹的題目,就嘗試著自己寫乙個prim演算法吧。基本思路是in i 維護每個i是否在生成樹裡面,用優先順序佇列儲存邊struct,過載小於運算子,但是不知道為什麼就是wa了。現在也還沒相通。然後就去看題解了,不過...