第一行n,m,表示總格有n個點,m條網路連線 接下來m行,表示每條網路連線所連線的a、b點和線的長度。 接下來乙個數t1,表示uoi有多少臺電腦。 下一行t1個數,表示uoi每台電腦的編號。 接下來乙個數t2,表示有多少臺伺服器。 下一行t2個數,表示每台伺服器編號。
題意轉化:給你一些源點和一些匯點,求一條連線源點和匯點的路徑並且使得這條路徑的長度最小。
使用n次spfa顯然會tle。這時候我們要引入乙個概念:超級源點。意思是引入乙個0號點,能連線所有源點,並且不影響原圖,即長度為0。這樣跑1次spfa就夠。此題還要求輸出源點和匯點,我們開乙個pre陣列,記錄每個點的前驅即可(前驅指的是從哪個源點可以到達那裡)。
**中稍稍做了一點修改,本身思路與其相符。
#includeusingnamespace
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行...