#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;
}
PAT 1001 Public Bike Management
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.