JLOI2011 飛行路線

2022-05-27 19:00:12 字數 1744 閱讀 1699

【題面】:

飛行路線

【思路】:

初看此題是不是有點懵逼.jpg啊。。(反正我就是)

首先最短路\(spfa\)的做法還是比較明顯,但是本題要求他還可以免費搭乘\(k\)次航線,然而\(k\)很小(\(k\leq10\)),可以當作\(dp\)的一維來處理。那麼就可以考慮\(dp\)。

我們用\(dis[i][j]\)表示從起點到\(i\)的最小花費,那麼易得\(dis[i][0]\)就是最短路的花費,其餘的情況通過列舉\(k\)來得到。

我覺得還是好理解就不給注釋了。。

#include#include#include#define inf 0x3f3f3f3f

using namespace std;

int n,m,k;int s,t;

const int maxn = 10005;

const int maxm = 50005;

struct edgee[maxm<<1];int head[maxn];int cnt=0;bool r[maxn];

int dis[maxn][15];//表示從s到i這個點使用j次技能的最短路

//dp[v][j] = max(dp[u][j]+dis(u,v) , dp[u][j-1])

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

queueq;

inline void spfa()

}for(int j=1;j<=k;++j)}}

int ans = inf;

for(int i=0;i<=k;++i) ans = min(ans , dis[t][i]);

printf("%d\n",ans);

}int main()

spfa();

return 0;

}

然鵝這個只有\(90dpts\),你還要乙個\(slf\)優化(大霧

#include#include#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

int n,m,k;int s,t;

const int maxm = 50005;

const int maxn = 10005;

inline ll read()

while(c>='0'&&c<='9')

return x*f;

}struct edgee[maxm<<1];int head[maxn];int cnt=0;int dis[maxn][15];int used[maxn];int r[maxn];

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

struct node

node(int a,int b):p(a),used(b){}

};dequeq;

inline void spfa(int x)

if(u.used+1 <= k && dis[v][u.used+1] > dis[u.p][u.used])}}

}int main()

spfa(s);

int ans = inf;

for(int i=0;i<=k;++i) ans = min(ans , dis[t][i]);

printf("%d",ans);

return 0;

}

JLOI2011 飛行路線

提交傳送門 師兄們覺得我是不是很挫啊,做了1天多才做出這道裸spfa 人家只是試著打了一下拆點而已嘛 就是spfa只是2維而已 d i 0 代表第i個點 不用免費次數時得最小距離 d i 1 代表第i個點 用免費次數時得最小距離 就很簡單了是不是?description alice和bob現在要乘飛...

JLOI2011 飛行路線

alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 nnn 個城市設有業務,設這些城市分別標記為 000 到 n 1n 1n 1 一共有 mmm 種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行...

JLOI2011 飛行路線

alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 n 個城市設有業務,設這些城市分別標記為 0 到 n 1 一共有 m 種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次...