最短路径加DFS的模板题,不大容易,需要多写才能熟练
#include<bits/stdc++.h>
using namespace std;
const int INF = 10000000;
const int MAXN = 550;
int G[MAXN][MAXN];
vector<int> pre[MAXN];
bool vis[MAXN];
int d[MAXN];
int bikeNumber[MAXN];
int maxCapacity;
int n;
int targetStation;
int roadNumber;
vector<int> path;
vector<int> tempPath;
int minNeed = INF;
int minBack = INF;
void dijkstra(int s)
{
d[s] = 0;
for(int i = 0;i<=n;i++)
{
int u = -1;
int MIN = INF;
for(int j = 0;j<=n;j++)
{
if(vis[j] == false && d[j] < MIN)
{
MIN = d[j];
u = j;
}
}
if(u == -1)
{
return ;
}
vis[u] = true;
for(int v = 0;v <= n;v++)
{
if(G[u][v] != INF && vis[v] == false)
{
if(d[v] > G[u][v] + d[u])
{
d[v] = G[u][v] + d[u];
pre[v].clear();
pre[v].push_back(u);
}
else if(d[v] == G[u][v] + d[u])
{
pre[v].push_back(u);
}
}
}
}
}
void DFS(int u)
{
if(u == 0)
{
int need = 0;
int back = 0;
for(int i = tempPath.size() - 1;i>=0;i--)
{
int id = tempPath[i];
if(bikeNumber[id] > 0)
{
back += bikeNumber[id];
}
else
{
if(back >= abs(bikeNumber[id]))
{
back -= abs(bikeNumber[id]);
}
else
{
need += abs(bikeNumber[id]) - back;
back = 0;
}
}
}
if(need < minNeed)
{
minNeed = need;
minBack = back;
path = tempPath;
}
else if(need == minNeed && back < minBack)
{
minBack = back;
path = tempPath;
}
}
tempPath.push_back(u);
for(int i = 0;i<pre[u].size();i++)
{
DFS(pre[u][i]);
}
tempPath.pop_back();
}
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
cin>>maxCapacity>>n>>targetStation>>roadNumber;
maxCapacity = maxCapacity / 2;
for(int i = 1;i<=n;i++)
{
cin>>bikeNumber[i];
bikeNumber[i] -= maxCapacity;
}
fill(d,d + MAXN,INF);
fill(G[0],G[0] + MAXN * MAXN,INF);
for(int i = 0;i<roadNumber;i++)
{
int l,r,s;
cin>>l>>r>>s;
G[l][r] = s;
G[r][l] = s;
}
dijkstra(0);
DFS(targetStation);
printf("%d 0",minNeed);
for(int i = path.size() - 1;i>=0;i--)
{
printf("->%d",path[i]);
}
printf(" %d",minBack);
return 0;
}