51nod 1443 路徑和樹 單元最短路徑

2022-07-27 14:18:23 字數 1107 閱讀 1661

分析:很容易想到先搞一遍單源最短路徑,然後只保留最短路徑上的邊,接下來容易想到最小生成樹,但是因為有的邊只刪了乙個方向,所以變成了有向圖了,要求的就是最小樹形圖,比較麻煩而且容易t。。。

實際上,考慮在連好的圖裡加乙個點,肯定是加連向它的最短邊,類似貪心的思路,所以結果就是刪完後的圖中,每個點的最小前驅邊權的和。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8 typedef long

long

ll;9

const

int maxn=3e5+5;10

const ll inf=1e18;

11struct

edge

15};

16bool

cmp(edge a,edge b)

19 vectoredges;

20 vectorg[maxn];

21void addedge(int u,int

v,ll w)

2728

intu,n,m;

29ll dis[maxn];

30ll pre[maxn];

31bool

inq[maxn];

32void

spfa()49}

50else

if(dis[e.v]==dis[e.u]+e.w)pre[e.v]=min(pre[e.v],e.w);51}

52}53}

54int

main()

63 scanf("

%d",&u);

64spfa();

65 ll ans=0;66

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

69 printf("

%lld\n

",ans);

70return0;

71 }

51Nod 1443 路徑和樹

還是一道很簡單的基礎題,就是乙個最短路徑樹的型別題目 我們首先可以發現這棵樹必定滿足從1出發到其它點的距離都是原圖中的最短路 換句話說,這棵樹上的每一條邊都是原圖從1出發到其它點的最短路上的邊 那麼直接跑最短路,spfa,不存在的?我只信dj,然後記錄那些邊在最短路上 然後直接跑mst即可。是不是很...

51nod 1610 路徑計數

原題連線 考慮不同權重為 d 的倍數的邊組成的圖.f d 為此圖中。路徑總數量。由於m 50000 明顯會出現重邊。建議限制邊的數量或者使用鄰接矩陣存圖。矩陣更為方便。由於最初沒有考邊過多。使用了鍊錶 拓撲排序。量較大。include include include include define m...

51Nod1967 路徑定向

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案 input 第一行兩個正整數n,m,表示1 n號點與m條邊 接下來m行,每行兩個正整數xi,yi,表示存在一條有向邊從xi指向yi n 10 5,m 3 10 5,xi,yi n output 第一行乙個整數...