題目
題解
裸的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了。現在也還沒相通。然後就去看題解了,不過...