1018. Public Bike Management (30)

#include <iostream>
#include <vector>

using namespace std;

struct node
{
	int next, t;
};

vector<node> v[510];
vector<int> path, res;
int perfect, sp, vis[510], mint = 10000000, mintake = 10000000, minback = 10000000, bikes[510];

void dfs(int cur, int curt, int curtake, int curback)
{
	int flag = 0;
	if(cur == sp)
	{
		if(curt < mint)
		{
			flag = 1;
		}
		else if(curt == mint)
		{
			if(curtake < mintake)
			{
				flag = 1;
			}
			else if(curtake == mintake)
			{
				if(curback < minback)
				{
					flag = 1;
				}
			}
		}

		if(flag == 1)
		{
			mint = curt;
			mintake = curtake;
			minback = curback;
			res = path;
		}

		return;
	}

	int size = v[cur].size(), i, next, nextt, nexttake, nextback;
	for(i = 0; i < size; i++)
	{
		next = v[cur][i].next;
		nextt = v[cur][i].t + curt;
		
		if(vis[next] == 0 && nextt <= mint)
		{
			if(curback + bikes[next] > perfect)
			{
				nexttake = curtake;
				nextback = curback + bikes[next] - perfect;
			}
			else
			{
				nexttake = curtake + perfect - (curback + bikes[next]);
				nextback = 0;
			}

			vis[next] = 1;
			path.push_back(next);

			dfs(next, nextt, nexttake, nextback);

			vis[next] = 0;
			path.pop_back();
		}
	}
}

int main()
{
	int cmax, n, m;
	scanf("%d%d%d%d", &cmax, &n, &sp, &m);

	int i;
	for(i = 1; i <= n; i++)
	{
		scanf("%d", &bikes[i]);
	}

	node nod;
	int a, b;

	for(i = 1; i <= m; i++)
	{
		scanf("%d%d%d", &a, &b, &nod.t);

		nod.next = b;
		v[a].push_back(nod);

		nod.next = a;
		v[b].push_back(nod);
	}

	perfect = cmax / 2;
	vis[0] = 1;
	path.push_back(0);

	dfs(0, 0, 0, 0);

	printf("%d ", mintake);

	int size = res.size();
	for(i = 0; i < size; i++)
	{
		if(i > 0)
		{
			printf("->");
		}

		printf("%d", res[i]);
	}

	printf(" %d\n", minback);

	system("pause");
	return 0;
}

 

posted on 2025-11-23 16:56  王景迁  阅读(2)  评论(0)    收藏  举报

导航