二維最短路

2021-07-01 22:56:43 字數 1383 閱讀 4543

三元組用map

int,int>,set

>儲存

可以通過前繼pre和當前節點u找到下乙個v,使得(pre,u,v)在三元組中的節點

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define mem(a,b) memset(a,sizeof(a),b)

#define ll long long

#define inf 0x3f3f3f3f

#define mp make_pair

using

namespace

std;

const

int maxn = 3000+10;

int n,m,k;

vector

g[maxn][2];

mapint,int>, set

> ma;

int d[maxn][maxn],fa[maxn][maxn];//d[u][v]從起點到達狀態「前繼是u,當前點是v」的最短路徑

bool inq[maxn][maxn];

int cnt[maxn][maxn];

//bool vis[maxn][maxn];

int npre,ans;

void add(int u,int v,int w)

struct heapnode

};//法一:dij+heap優化

/*void dij(int s,int t));

while(!q.empty()));}}

}}*///法二:spfa

void spfa(int s,int t));

while(!q.empty()));

inq[u][v]=1;

if(++cnt[u][v]>n) return ;}}

}}void print(int pre,int u)

print(fa[pre][u],pre);

printf(" %d",u);

}int main()

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

ma.clear();

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

//dij(1,n);法一

spfa(1,n);//法二

npre=-1,ans=inf;

for(int i=1;iif(d[i][n]if(ans!=inf)

else

printf("-1\n");

}

Fishmonger SPOJ 二維最短路

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

最短路 二維 Roads

description 城市中有r條有向馬路,n個馬路連線點,通過每條馬路都要花去一定費用。你現在在編號為1的連線點 手裡有k元錢,要去n號連線點的最短路徑的長度是多少?途中經過道路的花費不能超過k。注意 兩個 馬路連線點間可能有多條馬路 input 第一行,k 0 k 10000 第二行,n 2 ...

二維最短路 時間優化

輸入的第一行包含整數k,0 k 10000,這是bob在路上可以花費的最大硬幣數。第二行包含整數n,2 n 100,即城市總數。第三行包含整數r,1 r 10000,即道路總數。以下r行中的每一行通過指定整數s d l和t來描述一條道路,這些整數由單個空白字元分隔 s為源城市,1 s n d為目的地...