您的位置:首页 > 其它

PAT 1018 Public Bike Management DFS+SPFA

2014-08-25 23:34 417 查看
被题目的意思搞跪了....从PBMC出发,到终点,路上把每个站点都调整到最优。路上如果后面有站点可以获得到多余的车,也不能把车带回来给前面的站点

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define ll long long
using namespace std;
queue<int>q;
vector<int>pre[505],path[505],ans,tmp;
int g[505][505],in[505],dis[505],a[505];
int ed,c,n,m,mn_have,mn_need;
void spfa()
{
	memset(dis,0x7f,sizeof(dis));
	memset(in,0,sizeof(in));
	q.push(0);
	in[0] = 1;
	dis[0] = 0;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		in[u] = 0;
		for(int i = 0;i<=n;i++)
		{
			if(g[u][i] == -1)continue;
			if(dis[i]>dis[u]+g[u][i])
			{
				dis[i] = dis[u]+g[u][i];
				pre[i].clear();
				pre[i].push_back(u);
				if(!in[u])
				{
					q.push(i);
					in[i] = 1;
				}
			}
			else if(dis[i] == dis[u]+g[u][i])pre[i].push_back(u);
		}
	}
}
void dfs(int u,int have,int need)
{
	tmp.push_back(u);
	if(u == ed)
	{
		if(need<mn_need||(need == mn_need&&have<mn_have))
		{
			ans = tmp;
			mn_need = need;
			mn_have = have;
		}
	}
	for(int i = 0;i<path[u].size();i++)
	{
		int v = path[u][i];
		int t_have = have+a[v]-c/2,t_need = need;
		if(t_have<0)
		{
			t_need = need-t_have;
			t_have = 0;
		}
		dfs(v,t_have,t_need);
	}
	tmp.pop_back();
}
int main()
{
	int i,j,x,y,z;
	while(scanf("%d%d%d%d",&c,&n,&ed,&m)!=EOF)
	{
		memset(g,-1,sizeof(g));
		for(i = 1;i<=n;i++)scanf("%d",&a[i]);
		for(i = 1;i<=m;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			g[x][y] = g[y][x] = z;
		}
		spfa();
		for(i = 0;i<=n;i++)
			for(j = 0;j<pre[i].size();j++)
				path[pre[i][j]].push_back(i);
		mn_have = mn_need = 1e9;
		dfs(0,0,0);
		printf("%d ",mn_need);
		for(i = 0;i<ans.size();i++)
		{
			printf("%d",ans[i]);
			if(i!=ans.size()-1)printf("->");
		}
		printf(" %d\n",mn_have);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: