給定乙個圖,每個集合內部的點相互到達的話費是一定的,兩個人分別在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 二維最短路
乙個圖中,對於每一條邊有兩個權值 路費和時間,我們要找一條從源點出發到終點的路,在這條路的時間不超過給定時間的基礎上,找到路費最少的路。如果按照普通的最短路,會因為有乙個時間的限制而找不到正確的解。找不到正確的解的原因就是對於每個點只能存乙個時間,然而我們可能在多個不同時間到達乙個點,不一定哪個時間...