[USACO2.4]回家 Bessie Come Home

来源:互联网 发布:lol代练接单软件 编辑:程序博客网 时间:2024/05/18 03:59

题目描述

现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。

注意'm'和'M'不是同一个牧场 否则错误 上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing)(PS:表郁闷…告诉我set of咋用就不郁闷了…),比如

M a a m m z

输入输出格式

输入格式:

第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

第 2 ..P+1行: 用空格分开的两个字母和一个整数:

被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

输出格式:

单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

输入输出样例

输入样例#1:
5A d 6B d 3C e 9d Z 8e Z 3
输出样例#1:
B 11

说明

翻译来自NOCOW

USACO 2.4




【题解】

dijkstra求单源最短路

/*ID:luojiny1LANG:C++TASK:comehome*/#include<cstdio>#include<vector>#include<queue>#include<cstring>#define INF 2147483647using namespace std;const int maxn = 10010;/*紫书上照搬的dijkstra模板****/struct Edge {int from, to, dist;Edge(int u, int v, int d) :from(u), to(v), dist(d){}};struct HeapNode {int d, u;bool operator<(const HeapNode&rhs)const {return d > rhs.d;}};int n=0,SizeM,d[maxn];//SizeM表示边的个数vector<Edge>edges;vector<int>G[maxn];bool done[maxn];void init() {for (int i = 0; i < maxn; i++)G[i].clear();}void AddEdge(int from, int to, int dist) {edges.push_back(Edge(from, to, dist));SizeM = edges.size();G[from].push_back(SizeM - 1);}void dijkstra(int S){priority_queue<HeapNode>Q;for (int i = 0; i < n; i++)d[i] = INF;d[S] = 0;memset(done, 0, sizeof(done));Q.push(HeapNode { 0, S });while (!Q.empty()) {HeapNode x = Q.top(); Q.pop();int u = x.u;if (done[u])continue;done[u] = true;for (int i = 0; i < G[u].size(); i++) {Edge &e = edges[G[u][i]];if (d[e.to] > d[u] + e.dist) {d[e.to] = d[u] + e.dist;Q.push(HeapNode{ d[e.to],e.to });}}}}/************************************************/char p[maxn];//指向点对应的字符int str[255];//指向字符对应的点bool has_cow[maxn] = { 0 };int main(){freopen("comehome.in", "r", stdin);freopen("comehome.out", "w", stdout);int dist,m;memset(p, -1, sizeof(p));memset(str, -1, sizeof(str));char from, to;scanf("%d",&m);getchar();init();for (int i = 0; i < m; i++) {scanf("%c %c %d", &from, &to, &dist);getchar();if (str[from] == -1) {p[n] = from;if (from >= 'A'&&from <= 'Z')has_cow[n] = true;str[from] = n++;}if (str[to] == -1) {p[n] = to;if (to >= 'A'&&to <= 'Z')has_cow[n] = true;str[to] = n++;}AddEdge(str[from], str[to], dist);AddEdge(str[to], str[from], dist);}int ans = INF,id=0;has_cow[str['Z']] = 0;dijkstra(str['Z']);for (int i = 0; i < n; i++)if (d[i] < ans&&has_cow[i]) {id = i;ans = d[i];}printf("%c %d\n",p[id],ans);return 0;}



原创粉丝点击