本题用Dijstra或者搜索。
dfs代码如下:
#include<stdio.h>
#include<stdlib.h>
#define maxn 0x7fffffff
struct Node_Type{
int dis;
int bsend;
int bback;
int path[508];
}res,cur;
int c,n,s,m,cnt=0;
int bk[508],rel[508][508],vst[508];
void dfs(int p){
int i,j;
if(p==s){
if(cur.dis<res.dis){
res=cur;
}
else if(cur.dis==res.dis){
if(cur.bsend<res.bsend){
res=cur;
}
else if(cur.bsend==res.bsend){
if(cur.bback<res.bback){
res=cur;
}
}
}
return;
}
for(i=1;i<=n;i++){
if(vst[i]==0&&rel[p][i]!=-1){
vst[i]=1;
int distmp=cur.dis;
int bsendtmp=cur.bsend;
int bbacktmp=cur.bback;
cur.dis+=rel[p][i];
int tmp=bk[i]-c/2;
if(tmp>=0){
cur.bback+=tmp;
}
else{
tmp=-tmp;
if(tmp<=cur.bback){
cur.bback-=tmp;
}
else{
cur.bsend+=(tmp-cur.bback);
cur.bback=0;
}
}
cnt++;
cur.path[cnt]=i;
dfs(i);
cnt--;
cur.dis=distmp;
cur.bsend=bsendtmp;
cur.bback=bbacktmp;
vst[i]=0;
}
}
}
int main(){
int i,j;
int si,sj,tij;
scanf("%d %d %d %d",&c,&n,&s,&m);
for(i=1;i<=n;i++){
scanf("%d",&bk[i]);
}
for(i=0;i<=n;i++){
vst[i]=0;
for(j=0;j<=n;j++){
rel[i][j]=-1;
}
}
for(i=1;i<=m;i++){
scanf("%d %d %d",&si,&sj,&tij);
rel[si][sj]=tij;
rel[sj][si]=tij;
}
cur.dis=0;cur.bsend=0;cur.bback=0;
res.dis=maxn;res.bsend=maxn;res.bback=maxn;
dfs(0);
printf("%d %d",res.bsend,0);
for(i=1;res.path[i]!=s;i++){
printf("->%d",res.path[i]);
}
printf("->%d",s);
printf(" %d\n",res.bback);
return 0;
}