问题描述:当某个站需要调整时,控制中心选择最近的路径到达该站,并调整路径上所有的站。注意:可以从路径上收集车。
解题思路:dijksta的应用。首先选择最短的路径,再判断所需携带的车辆。局部最优并不是全局最优。。。。。
所以dijkstra错误。应该用dfs。
dijkstra方法。25分
#include
#include
using namespace std;
#define MAX 505
#define INF 0x0ffffff
int graph[MAX][MAX];
vectorC,path;
int Cmax,N,Sp;
void output(int v)
{
if(v){
output(path[v]);
printf("->%d",v);
}
}
void dijkstra()
{
vectorvis(N,0);
vectorcost(N),sendbike(N,0),backbike(N,0);
for(int i=1;iCmax)backbike[i]=C[i]-Cmax;
else sendbike[i]=Cmax-C[i];
}
}
for(int i=1;iCmax)b=C[j]-Cmax;
else s=Cmax-C[j];
int y=sendbike[v]+s-backbike[v];//v点之前带去的+j点带去的-v点需带回的。
int z=backbike[v]-s+b;//v点带回的-j点带去的+j点带回的。
if(y<0)y=0;//如果带去的为负,表示不需带
if(z<0)z=0;//带回的为负,表示无需带回
if(x
AC代码:dfs
#include
#include
using namespace std;
#define inf 999999
int cmax, n, sp, m, send,back;
#define MAX 505
int bike[MAX];
int route[MAX][MAX];
int visit[MAX];
int minsend = inf, minback = inf, mindis = inf;
vector path, temppath;
void dfs(int v,int tempsend,int tempback,int tempdis)
{
temppath.push_back(v);
visit[v] = 1;
if(v == sp){
if(mindis > tempdis){
minsend = tempsend; minback = tempback;
mindis = tempdis; path = temppath;
}else if(mindis == tempdis){
if(minsend > tempsend){
minsend = tempsend; minback = tempback;
path = temppath;
}else if(minsend == tempsend && minback > tempback){
minback = tempback;
path = temppath;
}
}
return;
}
for(int i = 1; i <= n; i++) //遍历相邻结点
{
if(visit[i] == 0&&route[v][i] != inf){
int temp = bike[i] - cmax/2;
int tempb = tempback, temps = tempsend;
if(temp >= 0)
tempb += temp;
else{
if(tempback + temp < 0){
temps -= (tempback + temp);
tempb = 0;
}else{
tempb += temp;
}
}
dfs(i,temps,tempb,tempdis + route[v][i]);
temppath.pop_back(); //倒退一个
visit[i] = 0; //又从temppath里最后一个点开始,查看可能路径
}
}
}
int main()
{
//freopen("test.txt","r",stdin);
scanf("%d %d %d %d",&cmax,&n,&sp,&m);
fill(route[0],route[0] + 505 * 505, inf);
for(int i = 0; i < n; i++)
scanf("%d",&bike[i + 1]);
for(int i = 0; i < m; i++){
int ti, tj, v;
scanf("%d %d %d",&ti,&tj,&v);
route[ti][tj] = route[tj][ti] = v;
}
dfs(0,0,0,0);
printf("%d ",minsend);
for(int i = 0; i < path.size(); i++){
if(i != 0)
printf("->");
printf("%d",path[i]);
}
printf(" %d",minback);
return 0;
}