【題面】:
飛行路線
【思路】:
初看此題是不是有點懵逼.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現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次...