uva 10537 The Toll! Revisited

题目:The Toll! Revisited


题意:给一张由A~Z和a~z构成的无向图,大写字母表示城镇,小写字母表示村庄。每运送20个物品(不足20个当20个)进入城镇需要交1个过路费,无论运送多少物品进入村庄都只需一个过路费。给出起点和终点,求到达终点时有p个物品,需要从起点运多少物品。(进入终点要交费,进入起点不用交费)


思路:dijkstra求最短路。


代码:

#include<bits/stdc++.h>
using namespace std;

#define n 52
#define ll long long

struct Pair {
	ll x;
	ll y;
	Pair(ll xx=0,ll yy=0) {
		x=xx,y=yy;
	}
	bool operator < (const Pair& oth) const {
		return x>oth.x;
	}
};

int m;
int s,e;

vector<int> a[n+5];

ll dist[n+5];

int num;

void init() {
	for(int i=0; i<n; i++) a[i].clear();
}

void readc(int& x) {
	char y;
	while(~(y=getchar())&&!isalpha(y));
	if(y<'a') x=y-'A';
	else x=y-'a'+26;
}

bool v(int x) {
	if(x<26) return true;
	return false;
}

char findc(int x) {
	if(x<26) return (char)x+'A';
	else return (char)x-26+'a';
}

void readin() {
	for(int i=1; i<=m; i++) {
		int x,y;
		readc(x),readc(y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	for(int i=0; i<n; i++) {
		sort(a[i].begin(),a[i].end());
	}
	scanf("%d",&num);
	readc(s),readc(e);
}

ll gt2(ll x,ll y) {
	if(y==0) return x-1;
	return x-(x+19)/20;
}

ll gt(ll x,ll y) {
	if(y==0) {
		return x+1;
	}
	ll z=x*20/19;
	while(gt2(z,y)<x) z++;
	return z;
}

void dijkstra(int bg) {
	priority_queue<Pair> p;
	bool c[n+5]= {0};

	for(int i=0; i<n; i++) dist[i]=(1ll<<50);
	dist[bg]=num;
	p.push(Pair(gt(num,v(bg)),bg));
//	cout<<num<<endl;

	while(!p.empty()) {
		Pair x=p.top();
		p.pop();
//		printf("%lld %c %lld\n",x.x,findc(x.y),dist[x.y]);
		if(c[x.y]) continue;
		c[x.y]=true;
		for(int i=0; i<a[x.y].size(); i++) {
			if(dist[a[x.y][i]]>x.x) {
				dist[a[x.y][i]]=x.x;
				p.push(Pair(gt(dist[a[x.y][i]],v(a[x.y][i])),a[x.y][i]));
//				cout<<"  --  "<<findc(a[x.y][i])<<' '<<dist[a[x.y][i]]<<endl;
			}
		}
	}
//	printf("\n");
}

void find(int x,vector<int>& ans) {
	while(x!=e) {
		ans.push_back(x);
		for(int i=0; i<a[x].size(); i++) {
			if(gt2(dist[x],v(a[x][i]))==dist[a[x][i]]) {
				x=a[x][i];
				break;
			}
		}
	}
	ans.push_back(x);
}

void print(int& t) {
	t++;
	printf("Case %d:\n%lld\n",t,dist[s]);
	vector<int> ans;
	find(s,ans);
	printf("%c",findc(ans[0]));
	for(int i=1; i<ans.size(); i++) {
		printf("-%c",findc(ans[i]));
	}
	printf("\n");
}

int main() {
	int t=0;
	while(~scanf("%d",&m)&&~m) {
		init();
		readin();
		if(s==e) printf("Case %d:\n%d\n%c\n",++t,num,findc(s));
		else {
			dijkstra(e);
			print(t);
		}
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VMware Tools是一组用于增强虚拟机性能和功能的软件。它提供了与虚拟机主机之间的更好交互和协作。根据提供的引用内容,您遇到的问题可能是拼写错误。正确的名称是"VMware Tools",而不是"VMware Toll"。如果您无法找到VMware Tools的压缩包,请确保您已正确安装Ubuntu,并按照正确的步骤在VMware中安装VMware Tools。请参考中提供的网上教程,按照指示执行安装步骤。如果您仍然遇到问题,可以尝试查找其他可靠的教程或寻求VMware支持社区的帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [“找不到VMware Tools 安装包”的解决办法——安装VMware Tools](https://blog.csdn.net/Donggua_BIT/article/details/100740347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [vmware虚机安装vmtool](https://blog.csdn.net/weixin_43570089/article/details/90637909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值