PAT 1001 Public Bike Management

#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<limits.h>
using namespace std;
#define max 501
#define INF 0x6FFFFFF
#define No_road  -1
int Bike[max],road[max][max];
int c,n,p,m;
 
struct s_city{
    int time,capacity;
    int prev[10],pcnt;
    bool visit;
}city[max];
 
int MAX(int m,int n)
{  if(Bike[m]>Bike[n])
    return m;
else
    return n;
}
int main()
{
    cin>>c>>n>>p>>m;
    int i,j;
    Bike[0]=0;
    for(i=1;i<=n;i++)
        cin>>Bike[i];
    //數據初始化
    for (i=0;i<=n;i++)
    {
        city[i].time=No_road;
        city[i].visit=false;
        for(j=0;j<=n;j++)
            road[i][j]=No_road;
 
    }
 
    for(i=0;i<m;i++)
    {
        int x,y,t;
        cin>>x>>y>>t;
        road[x][y]=t;
        road[y][x]=t;//因爲路相同,形成無向圖
    }
    //dijkstra
    int s=0;
    city[s].visit=true;
    city[s].time=0;
 
    while(s!=p)
    {
        //cout<<"StartPoint:"<<s<<endl;
        int minc=s;
        for (i=1;i<=n;i++)
        {
            if(city[i].visit) continue;
             
            {
                if(road[s][i]!=No_road)
                {
                    int tt=city[s].time+road[s][i];
                    if(city[i].time==No_road || tt<city[i].time )
                    {
                        city[i].time=tt;
                        city[i].prev[0]=s;
                        city[i].pcnt=1;//pcnt記載的是到此點相同時間的路徑數
                    }
                    else if(tt==city[i].time)
                        city[i].prev[city[i].pcnt++]=s;
                }
            }
            //find next s
            if(city[i].time!=No_road&&(minc==s||city[i].time<city[minc].time))//最重要解決如何找next s點
                minc=i;//採用從相鄰點中選擇最短時間的點爲下一個點,minc相當於標記點
        }
        //test output
    assert(minc!=s);
    s=minc;
    city[s].visit=true;
}
//DFS:
    int collectnum=0;
    int path[100];
    int target=p,mm;
    int sendnum=0,backnum=0;
     
     
        i=0;int target1;
    while(target!=0)
    {
        if(city[target].pcnt==1)
        {  
            path[i++]=target;
            target1=city[target].prev[0];
            if(Bike[target]<0.5*c)
            {
                    sendnum+=0.5*c-Bike[target];
                    if(Bike[target1]>0.5*c)
                    {  
                          if(Bike[target1]-0.5*c>sendnum)
                            {      //不知道爲什麼,放在後面不行
                                    Bike[target1]=Bike[target1]-sendnum;
                                    sendnum=0;
                                    //Bike[target1]=Bike[target1]-sendnum;
                           }
                          else
                          {
                            sendnum+=(0.5*c-Bike[target1]);
                            Bike[target1]=0.5*c;
                          }
                         
                             
                    }
            }
            else
                 
            {
                //printf("BIke:%2d\n ",Bike[target]);
                backnum=backnum+Bike[target]-0.5*c;
            }
            target=target1;
        }
        else
        {
            for(j=0;j<city[target].pcnt-1;j++)
            {
                    mm=MAX(city[target].prev[j],city[target].prev[j+1]);
            }
            path[i++]=target;
            if(Bike[target]>0.5*c)
              {
                backnum=backnum+(Bike[target]-0.5*c);
            }
            else
                {
                sendnum=sendnum+0.5*c-Bike[target];
            }
            target=mm;
        }
 
    }
    path[i]=0;
    //先得到路徑,從路徑正向尋找
     
    printf("%d ",abs(sendnum));
    for(i;i>=0;i--)
    {   printf("%d",path[i]);
            if(i!=0)
                printf("->");
    }
//當sp車站超過一半,需要待會的
     
    printf(" %d",backnum);
     
     
     
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章