浙大PAT 1018题 1018. Public Bike Management

来源:互联网 发布:c 程序员面试宝典 编辑:程序博客网 时间:2024/06/15 00:04

本题用Dijstra或者搜索。

dfs代码如下:

#include<stdio.h>#include<stdlib.h>#define maxn 0x7fffffffstruct 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;}


 

0 0
原创粉丝点击