码迷,mamicode.com
首页 > 其他好文 > 详细

PAT Public Bike Management

时间:2015-06-10 01:05:30      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

Public Bike Management

比较复杂 甚入。 我的思路是直接用一个DFS递归回溯做了

关键是题意也比较模糊 注意点如下

1.去的路上可调整,回来不可调整

2.路径最短

3.满足2 且 送出去的车最少

4.满足3 且 拿回来的车最少

 

AC代码如下

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define MAX 1000000
  4 int C,N,Sp,M;
  5 int g[501][501];
  6 int flag[501];
  7 int weight[501];
  8 int path[501];
  9 int path1[501];
 10 int curdis,curbike,cursend;
 11 int dis,bike=MAX,mindis=MAX,minsend=MAX;
 12 int flag1,k=0;
 13 void dfs(int v)
 14 {
 15     int i,j=1;
 16     
 17     if(dis>mindis)
 18         return;
 19     path[k]=v;
 20     if(v==Sp)
 21     {    
 22         int flag1=0;
 23         if(mindis>dis)
 24             flag1=1;
 25         else if(dis==mindis)
 26         {
 27             if(cursend<minsend)
 28                 flag1=1;
 29             else if(cursend==minsend)
 30             {
 31                 if(curbike<bike)
 32                     flag1=1;
 33             }
 34         }
 35         if(flag1)
 36         {
 37             while(path1[j]!=0)
 38             {
 39                 path1[j]=0;
 40                 j++;
 41             }
 42             j=1;
 43             while(path[j]!=0)
 44             {
 45                 path1[j]=path[j];
 46                 j++;
 47             }
 48             mindis=dis;
 49             minsend=cursend;
 50             bike=curbike;
 51         }
 52         return;
 53     }
 54     
 55     flag[v]=1;
 56     for(i=1;i<=N;i++)
 57     {    
 58         if(flag[i]!=1&&g[v][i]>0)
 59         {        
 60             dis+=g[v][i];
 61             int lastcurbike=curbike;
 62             int lastcursend=cursend;
 63             
 64             if(weight[i]+curbike<C/2)
 65             {
 66                 cursend+=C/2-(weight[i]+curbike);
 67                 curbike=0;
 68             }
 69             else
 70                 curbike=weight[i]+curbike-C/2;
 71             k++;
 72             path[k]=v;
 73             dfs(i);    
 74             path[k]=0;    
 75             k--;            
 76             flag[i]=0;
 77             cursend=lastcursend;
 78             curbike=lastcurbike;
 79             dis-=g[v][i];
 80                         
 81         }    
 82     }    
 83 }
 84 int main()
 85 {
 86     int i,j=1,c1,c2,L;
 87     scanf("%d%d%d%d",&C,&N,&Sp,&M);
 88     for(i=1;i<=N;i++)
 89         scanf("%d",&weight[i]);
 90     for(i=1;i<=M;i++)
 91     {
 92         scanf("%d%d%d",&c1,&c2,&L);
 93         g[c1][c2]=g[c2][c1]=L;
 94     }
 95     dfs(0);
 96     printf("%d 0",minsend);
 97     while(path1[j]!=0)
 98     {
 99         printf("->%d",path1[j]);
100         j++;
101     }
102     printf(" %d\n",bike);
103 }

 

PAT Public Bike Management

标签:

原文地址:http://www.cnblogs.com/threezj/p/4564843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!