您的位置:首页 > 其它

【PAT】1018. Public Bike Management

2016-02-16 22:57 344 查看
先dijkstra搜索出所有最短路径,然后dfs出send最少的和take back最少的路径
#include<cstdio>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>

using namespace std;

const int maxn = 550;
const int INF = 1000000000;

int n,cmax,s,road;
int G[maxn][maxn],cnt[maxn];
vector<int> pre[maxn],temppath,path;
int d[maxn];
bool visit[maxn] = {false};
int minsend=INF,minback=INF;

void dijkstra(int s){
fill(d,d+maxn,INF);
d[s] = 0;
for(int i=0;i<maxn;i++)
pre[i].push_back(i);
for(int i=0;i<=n;++i){
int u=-1,min=INF;
for(int j=0;j<=n;j++)
if(visit[j]==false && d[j]<min){
u = j;
min = d[j];
}
if(u == -1)	return;
visit[u] = true;
for(int v=0;v<=n;++v){
if(visit[v]==false&&G[u][v]!=INF){
if(d[u] + G[u][v] < d[v]){
pre[v].clear();
pre[v].push_back(u);
d[v] = d[u] + G[u][v];
}
else if(d[u]+G[u][v] == d[v])
pre[v].push_back(u);
}
}
}
}

void dfs(int v){
if(v == 0){
temppath.push_back(v);
int tempsend=0,tempback=0;
for(int i=temppath.size()-2;i>=0;--i){
if(cnt[temppath[i]] < cmax){
if(tempback >= (cmax-cnt[temppath[i]]) ){
tempback -= (cmax-cnt[temppath[i]]);
}
else{
tempsend += (cmax-cnt[temppath[i]]-tempback);
tempback = 0;
}
}
else if(cnt[temppath[i]] > cmax){
tempback += (cnt[temppath[i]] - cmax);
}
}
if(tempsend < minsend){
minsend = tempsend;
path = temppath;
minback = tempback;
}else if(tempsend == minsend && tempback < minback){
minback = tempback;
path = temppath;
}
temppath.pop_back();
return ;
}

temppath.push_back(v);
for(int i=0;i<pre[v].size();++i){
dfs(pre[v][i]);
}
temppath.pop_back();
}

int main()
{
scanf("%d%d%d%d",&cmax,&n,&s,&road);
cmax /= 2;
fill(G[0],G[0]+maxn*maxn,INF);
for(int i=1;i<=n;i++)
scanf("%d",&cnt[i]);
while(road--){
int s1,s2,dis;
scanf("%d%d%d",&s1,&s2,&dis);
G[s1][s2] = G[s2][s1] = dis;
}
dijkstra(0);
dfs(s);
printf("%d ",minsend);
for(int i=path.size()-1;i>=0;i--){
printf("%d",path[i]);
if(i>0)
printf("->");
}
printf(" %d",minback);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: