分析:很容易想到先搞一遍單源最短路徑,然後只保留最短路徑上的邊,接下來容易想到最小生成樹,但是因為有的邊只刪了乙個方向,所以變成了有向圖了,要求的就是最小樹形圖,比較麻煩而且容易t。。。
實際上,考慮在連好的圖裡加乙個點,肯定是加連向它的最短邊,類似貪心的思路,所以結果就是刪完後的圖中,每個點的最小前驅邊權的和。
1 #include2 #include3 #include4 #include5 #include6 #include7using
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 第一行乙個整數...