三元組用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為目的地...