第六章 图论 15 AcWing 1495. 公共自行车管理
原题链接
算法标签
图论 最短路 DFS
思路
通常的多关键字dijkstra算法可以吗
对于2 3 如何搜索
对于2 3所搜索路径,使用1所搜索的最短路径,
取初带去的数量
取终带回的数量
代码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
// #define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N=505, INF=0x3f3f3f3f;
//int t, n, m, cnt, ans;
int cm, n, S, m, c[N], g[N][N], dis[N];
vector<int> path, ans;
bool st[N];
int send=INF, bring=INF;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
void dij(){
memset(dis, 0x3f, sizeof dis);
dis[S]=0;
rep(i, 0, n){
int t=-1;
rep(j, 0, n+1){
if(!st[j]&&(t==-1||dis[j]<dis[t])){
t=j;
}
}
st[t]=true;
rep(j, 0, n+1){
dis[j]=min(dis[j], dis[t]+g[t][j]);
}
}
}
void dfs(int u, int s, int mins){
if(u){
s-=cm/2-c[u];
mins=min(mins, s);
}
if(u==S){
int sd=abs(min(mins, 0));
int bg=s+sd;
if(sd<send){
ans=path, send=sd, bring=bg;
}else if(sd==send&&bg<bring){
ans=path, send=sd, bring=bg;
}
return;
}
rep(i, 1, n+1){
if(dis[u]==g[u][i]+dis[i]){
path.push_back(i);
dfs(i, s, mins);
path.pop_back();
}
}
}
// signed main(){
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cm=rd(), n=rd(), S=rd(), m=rd();
rep(i, 1, n+1){
c[i]=rd();
}
memset(g, 0x3f, sizeof g);
while(m--){
int a=rd(), b=rd(), c=rd();
g[a][b]=g[b][a]=min(g[a][b], c);
}
dij();
path.push_back(0);
dfs(0, 0, 0);
printf("%d %d", send, 0);
rep(i, 1, ans.size()){
printf("->%d", ans[i]);
}
printf(" %d", bring);
return 0;
}
参考文献
AcWing 1495. 公共自行车管理(PAT甲级辅导课)y总 视频讲解
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈