點選開啟鏈結
題意:給了n個點排成一行,每兩個距離為1,然後對於每個點來說它有個l和r,意思是距離在l到r中間的所有點它都能到達,費用是c,問從小出發的單源所有的點的距離
思路:看了網上神犇的題解有了點思路,因為每個點出去的費用都是相同的,而且費用的值大於0,那麼1點直接到達的所有點的最短路就不需要在更新了,因為剩下的肯定是比它大的,那麼對於這些個點我們壓入佇列,但是注意我們這裡的dis設定為點的加和,然後出發的又是最短的,到達的沒有訪問過的點又是最小的,所以不需要最短路時的乙個點可以訪問多次更新最小值,然後對於訪問過的點我們可以用並查集來判斷,對於乙個點來說,它若訪問過則與右邊的點合併,這樣我們就可以直接訪問下乙個沒被訪問過的點,而不需要暴力尋找了,優化的就是這裡
#pragma comment(linker, "/stack:102400000,102400000")
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3fll;
const int maxn=200010;
typedef pair p;
int l[maxn],r[maxn],f[maxn],n;
ll dis[maxn],c[maxn];
int find1(int x)
void unite(int a,int b)
void dijkstra(int s)
unite(ff,ff+1);
ff++;}}
}}int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&l[i]);
for(int i=1;i<=n;i++) scanf("%d",&r[i]);
for(int i=1;i<=n;i++) scanf("%i64d",&c[i]);
for(int i=1;i
hdu5361 最短路 並查集
題意 有n個點排成一排,編號從1到n,每個點可以到自己 l,r 距離的位置,花費c,問一號店到其他點的最小花費 pragma comment linker,stack 102400000,102400000 include include include include include includ...
hdu3790 最短路變形
這題就是比普通的最短路多維護了乙個cot陣列,cot i 表示的是起點到i節點的最短路徑對應的最小花費。要注意重邊的處理,我用鄰接表存圖,應該是重邊沒處理好,畢竟鄰接表處理重邊不太方便要把全部的都遍歷一遍,以後有重邊的情況還是用鄰接矩陣存圖算了。includeusing namespace std ...
hdu3790 最短路變形
這題就是比普通的最短路多維護了乙個cot陣列,cot i 表示的是起點到i節點的最短路徑對應的最小花費。要注意重邊的處理,我用鄰接表存圖,應該是重邊沒處理好,畢竟鄰接表處理重邊不太方便要把全部的都遍歷一遍,以後有重邊的情況還是用鄰接矩陣存圖算了。includeusing namespace std ...