hdu5521 二維最短路,集合或者拆點

2021-08-02 11:47:41 字數 1322 閱讀 7473

給定乙個圖,每個集合內部的點相互到達的話費是一定的,兩個人分別在1和m點上,問你他們倆到達某些點最小的花費,如果有好多點可以供選擇,就按從小到大的順序輸出那些點。

1 如果相互建邊感覺肯定太多了建不了。畢竟是n!。

2 這道題還考察對鄰接表的理解,鄰接表上的各行元素代表和這個點有相互連線的關係,我們可以讓每乙個集合都對應乙個點,然後每個集合內部的都連這個點。

每次鬆弛都只把這個點連線的所有集合點的元素進行鬆弛就行(其他的肯定比這個遠,所以我們只需要在這裡找到最近的就行,也可以理解為一種剪枝)

還有一種方法是拆點。通過建邊來實現,這種技能也需要好好練習。

#include 

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1e6+5;

typedef

long

long ll;

const

long

long inf=0x3f3f3f3f3f3f3f3f;

bool vis[maxn];

long

long cost[maxn];

int m,n;

long

long d1[maxn];

long

long d2[maxn];

vector

g[maxn];

int num[maxn];

vector

belong[maxn];

struct node

node(ll d, int u): d(d), u(u) {}

bool

operator

< (const node &a) const

};void dij(int s, ll *d) }}

}}void init()

int main()

}dij(1,d1);

dij(m,d2);

/*for(int i=1;i<=m;i++)*/

long

long ans=inf;

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

if(ans==inf)

else

}int jl=1;

while(!q.empty())

else

}printf("\n");}

} return

0;}

HDU 5521 巧妙地最短路

題意 n個點,m塊,塊的意思就是說,在塊中的點任意兩點的距離都是t,問分別從1點和n點走到某個點,這個點的花費就是二者較大的,問這n個點花費最小是多少,並按字典序列印序號 思路 這題頭疼的就是不知道怎麼建圖,暴力建圖會超記憶體,有乙個巧妙的方法是 將這個塊中的點全部連到乙個點上,每條邊花費t 2,這...

二維最短路

三元組用map int,int set 儲存 可以通過前繼pre和當前節點u找到下乙個v,使得 pre,u,v 在三元組中的節點 include include include include include include include include include define mem a,...

Fishmonger SPOJ 二維最短路

乙個圖中,對於每一條邊有兩個權值 路費和時間,我們要找一條從源點出發到終點的路,在這條路的時間不超過給定時間的基礎上,找到路費最少的路。如果按照普通的最短路,會因為有乙個時間的限制而找不到正確的解。找不到正確的解的原因就是對於每個點只能存乙個時間,然而我們可能在多個不同時間到達乙個點,不一定哪個時間...