FZYZOJ 下片 題解(最短路 超級源點)

2022-03-26 10:51:41 字數 1163 閱讀 3237

第一行n,m,表示總格有n個點,m條網路連線 接下來m行,表示每條網路連線所連線的a、b點和線的長度。 接下來乙個數t1,表示uoi有多少臺電腦。 下一行t1個數,表示uoi每台電腦的編號。 接下來乙個數t2,表示有多少臺伺服器。 下一行t2個數,表示每台伺服器編號。

題意轉化:給你一些源點和一些匯點,求一條連線源點和匯點的路徑並且使得這條路徑的長度最小。

使用n次spfa顯然會tle。這時候我們要引入乙個概念:超級源點。意思是引入乙個0號點,能連線所有源點,並且不影響原圖,即長度為0。這樣跑1次spfa就夠。此題還要求輸出源點和匯點,我們開乙個pre陣列,記錄每個點的前驅即可(前驅指的是從哪個源點可以到達那裡)。

**中稍稍做了一點修改,本身思路與其相符。

#includeusing

namespace

std;

queue

q;struct

node

;vector

v[100005

];int n,m,t1,t2,a[100005],vis[100005],pre[100005

];long

long ans=9223372036854775807,dis[100005

];int

ans1,ans2;

intmain()

); v[to].push_back((node));

}scanf("%d

",&t1);

for (int i=1;i<=t1;i++) scanf("

%d",&a[i]);

sort(a+1,a+t1+1

); scanf("%d

",&t2);

intt;

for (int i=1;i<=t2;i++) scanf("

%d",&t),pre[t]=t,vis[t]=1,dis[t]=0

,q.push(t);

while(!q.empty())}}

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

if (ans>dis[a[i]]) ans=dis[a[i]],ans1=a[i];

printf(

"%ld %d %d

",ans,ans1,pre[ans1]);

return0;

}

D Buy a Ticket 超級源點 最短路

題意 給定一張帶權圖,每個點都有權值ai。對於每個點i,找到乙個j,使得2 dis i,j aj的值最小。2 n 2 1 05,1 m 2 105 1 v i,ui n,v i ui 1 w i 10 12,1 ai 1 012 2 n 2 10 5,1 m 2 10 5,1 v i,u i n,v...

例題題解 最短路計數

給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。從最基礎的dj思考 迭代式進行迭代定然滿足d p va l np d p vald p v alnp 其中p pp表示當前迴圈的點,npnp np表示與p pp相連的新列舉的點。因此我們在這一處轉移做變...

最短路徑問題 題解

平面上有n nn個點 n 100 n 100 n 1 00 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。共有n m 3 n m 3 n m 3行...