2016江苏省CPC省赛 I - Itinerary Planning

Description

Mike moved to a new city.

There are bus stations in the city, each has a unique name. Each bus has its designated schedule, and sequentially docks at a series of bus stations. Bus lines are bi-directional, and thus you can get on the bus at a station, and get off at any other station in that bus' line. The city provides two kinds of bus services:

1. Type A: each ride costs $2.

2. Type B: rides are completely free of charge.

Given all bus lines in the city, a source station and a destination station, you should help Mike to find the cheapest ride plan to reach the destination from the source.

Input

First line: a positive integer T (T <= 10) indicating the number of test cases.

There are T cases following. In each case, the rst line contains n (1 <= n <= 1,000) indicating the number of bus lines. Then followed by n lines, each of which describes a bus line in the format of t k s1 s2 ... sk (1 <= k <= 10). Speci cally, t is the type of the bus (either A or B), k denotes the number of bus stations in that line, while strings s1,s2,... sk list names of these stations (a bus line may contain duplicated stations) The last line of the case contains two strings: Mike's source s and destination t. All bus station names are case-sensitive alphabets and is no longer than 20. Input guarantees the destination to be reachable.

Output

For each test case: output "Case #x: ans" (without quotes), where x is the number of the case, and ans is the minimum amount of money to reach the destination. 

Sample Input

1
3
A 5 NJU ZSL XJK YT ATZX
B 3 XJK HSDWY MGQ
A 3 HSDWY NJZ MGQ
NJU NJZ

Sample Output

Case #1: 4

spfa的应用,邻接矩阵开不出来,使用邻接表。

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
#define MAX 10005
#define INF 0x3f3f3f3f
struct Edge{
	int from,to,weight;
	Edge(int u,int v,int w):from(u),to(v),weight(w){};
};
vector<Edge> E;
vector<int> G[MAX];
void add_edge(int u,int v,int w)
{
	E.push_back(Edge(u,v,w));
	G[u].push_back(E.size()-1);
}
map<string,int> No;
void init()
{
	E.clear();
	No.clear();
	for (int i = 0; i<MAX; i++) G[i].clear();
}
bool vis[MAX];
int d[MAX];
void spfa(int st)
{
	memset(d,INF,sizeof(d));
	memset(vis,false,sizeof(vis));
	queue<int> q;
	q.push(st);
	d[st]=0;
	vis[st]=1;
	while (!q.empty())
	{
		int u=q.front(); 
		q.pop(); 
		vis[u]=0;
		for(int i=0;i<G[u].size();i++)
		{
			Edge &e=E[G[u][i]];
			int tmp=d[e.to];
			if(d[e.to]>d[e.from]+e.weight) d[e.to]=d[e.from]+e.weight;
			if(d[e.to]<tmp && !vis[e.to])
			{
				q.push(e.to);
				vis[e.to]=1;
			}
		}
	}
}

int main()
{
	int n,t;
	scanf("%d",&t);
	for(int kase=1;kase<=t;kase++)
	{
		init();
		scanf("%d",&n);
		int cnt=1;
		for(int i=1;i<=n;i++)
		{
			char type;
			int stop_num;
			string stop[12];
			cin>>type>>stop_num;
			for(int j=1;j<=stop_num;j++)
			{
				cin>>stop[j];
				if(No.count(stop[j])==0) No[stop[j]] = cnt++;
			}
			for(int u=1;u<=stop_num;u++)
			{
				for(int v=u+1;v<=stop_num;v++)
				{
					int weight=(type == 'A')?2:0;
					add_edge(No[stop[u]], No[stop[v]], weight);
					add_edge(No[stop[v]], No[stop[u]], weight);
				}
			}
		}
		string st,ed;
		cin>>st>>ed;
		spfa(No[st]);
		printf("Case #%d: %d\n",kase,d[No[ed]]);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值