常见方法解决,独立做出满开心的
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 510,INF = 0x3fffffff;
struct node
{
int city,disweight;
};
vector<node> Adj[maxn];
vector<int> route,pre[maxn];
int cMax,N,SP,M,bikeBack = INF,bikeSend = INF;
int weight[maxn],d[maxn];
bool vis[maxn] = {false};
void dijkstra()
{
fill(d,d + maxn,INF);
d[0] = 0;
for(int i = 0; i < N + 1; i++)
{
int u = -1, Min = INF;
for(int j = 0; j < N + 1; j++)
{
if(vis[j] == false and d[j] < Min)
{
u = j;
Min = d[j];
}
}
vis[u] = true;
for(int j = 0; j < Adj[u].size(); j++)
{
int v = Adj[u][j].city;
if(vis[v] == false)
{
if(d[u] + Adj[u][j].disweight < d[v])
{
d[v] = d[u] + Adj[u][j].disweight;
pre[v].clear();
pre[v].push_back(u);
}
else if(d[u] + Adj[u][j].disweight == d[v]) pre[v].push_back(u);
vector<int>::iterator it = pre[v].end() - 1;
}
}
}
}
void DFS(int Sp,vector<int> temproute,int bikeSendNum,int bikeBackNum)
{
temproute.push_back(Sp);
if(Sp == 0)
{
if(bikeSendNum < bikeSend)
{
bikeBack = bikeBackNum;
bikeSend = bikeSendNum;
route = temproute;
}
else if(bikeSendNum == bikeSend and bikeBackNum < bikeBack)
{
bikeBack = bikeBackNum;
bikeSend = bikeSendNum;
route = temproute;
}
return;
}
if(weight[Sp] > cMax/2)
{
if(bikeSendNum < weight[Sp] - cMax/2)
{
bikeBackNum += weight[Sp] - cMax/2 - bikeSendNum;
bikeSendNum = 0;
}
else bikeSendNum -= weight[Sp] - cMax/2;
}
else if(weight[Sp] < cMax/2) bikeSendNum += cMax/2 - weight[Sp];
for(int i = 0; i < pre[Sp].size(); i++)
{
DFS(pre[Sp][i],temproute,bikeSendNum,bikeBackNum);
}
}
int main()
{
scanf("%d%d%d%d",&cMax,&N,&SP,&M);
for(int i = 1; i <= N; i++)
{
scanf("%d",&weight[i]);
}
node c1,c2;
int tempDisWeight;
for(int i = 0; i < M; i++)
{
scanf("%d%d%d",&c1.city,&c2.city,&tempDisWeight);
c1.disweight = c2.disweight = tempDisWeight;
Adj[c1.city].push_back(c2);
Adj[c2.city].push_back(c1);
}
weight[0] = 0;
dijkstra();
vector<int> temproute;
DFS(SP,temproute,0,0);
printf("%d ",bikeSend);
for(vector<int>::iterator it = route.end() - 1; it >= route.begin(); it--)
{
if(it == route.end() - 1) printf("%d",*it);
else printf("->%d",*it);
}
printf(" %d",bikeBack);
}