訓練賽之 最短路

2021-07-30 10:43:37 字數 1418 閱讀 8355

**:

題意:給定n個點m條邊的無向圖(邊權全為1),讓你去掉最多的邊使得d(s1, t1) <= l1 && d(s2, t2) <= l2,若不能滿足輸出-1,反之輸出可以去掉的最多邊數。

思路:spfa預處理所有點之間的距離。求出在滿足d(s1, t1) <= l1 && d(s2, t2) <= l2的前提下,路徑需要的最少邊數ans,答案就是m - ans。

方法是:用dist[i][j]儲存最短路。列舉d(s1, t1) 和 d(s2, t2)這兩條路徑上可能重合的路徑d(i, j)

(1)d1=dist[s1][i] + dist[i][j] + dist[j][t1] <= l1 && d2=dist[s2][i] + dist[i][j] + dist[j][t2] <= l2

(2)d1=dist[s1][i] + dist[i][j] + dist[j][t1] <= l1 && d2=dist[s2][j] + dist[j][i] + dist[i][t2] <= l2

(3)d1=dist[s1][j] + dist[j][i] + dist[i][t1] <= l1 && d2=dist[s2][i] + dist[i][j] + dist[j][t2] <= l2

(4)d1=dist[s1][j] + dist[j][i] + dist[i][t1] <= l1 && d2=dist[s2][j] + dist[j][i] + dist[i][t2] <= l2

更新答案為ans = min(ans,  d1 + d2 - dist[i][j])。

#include#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define inf 1000000000

#define bug1 cout<<"bug1"memset(vis,0,sizeof(vis));

q.push(s);d[s]=0;

while(!q.empty())}}

}}void init()

int main()

for(int i = 1; i <= n; i++)spfa(i,dist[i]);

int s1,t1,l1,s2,t2,l2;

scanf("%d%d%d%d%d%d",&s1,&t1,&l1,&s2,&t2,&l2);

if(dist[s1][t1]>l1||dist[s2][t2]>l2)

int res = dist[s1][t1]+dist[s2][t2];

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

}printf("%d\n", m - res);

}return 0;

}

中石油訓練賽 小說 最短路 二分

題目大意 給出乙個無環無向圖,以及k,定義答案是點1到點n的任意一條路徑上,所經過的所有邊的權值中的第k大值,求答案的最小值。題目是中文題面,沒看懂大意可以直接去看原題目。題目分析 因為是要求權值中的最值,不是求最短路是多少,所以一開始想到的是最小生成樹,然後從大到小減去k個值,就是答案了,可惜的是...

訓練 9 13 訓練賽

a.hdu 6230 乙個合法的子串 s 3n 2 滿足條件即1 2n 1 為以n為回文中心的回文串,n 3n 2為以2n 1為中心的回文串。故我們可以通過尋找回文中心對,來判斷相應合法子串的個數。利用manacher求出每個位置的最長回文半徑,則若i,j滿足條件 i j 則應有 p i geqsl...

訓練賽 詠歎

安師大附中訓練題目 給定乙個1到n的排列a,對其進行氣泡排序 counter 0 while a不是公升序的 counter counter 1 for i 1 to n 1 if a i a i 1 then swap a i a i 1 endifend forend while那麼經過幾輪排序...