记录编号 231668 评测结果 AAAAAAAAA
题目名称 [USACO 2.4.4]回家 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.026 s
提交时间 2016-02-27 12:11:55 内存使用 0.36 MiB
显示代码纯文本
#include<cstdio>
#include<cctype>
#include<cstring>
#include<queue>
#define transfer(x) (x<='Z'&&x>='A')?(x-'A'+27):(x-'a'+1)
using namespace std;
struct edge{
	int to,next,w;
}lst[20050];
int len=1;
int first[60];//1-26:a-z 27-52:A-Z
void insert(int a,int b,int w){
	lst[len].to=b;
	lst[len].next=first[a];
	lst[len].w=w;
	first[a]=len;
	len++;
}
int dis[60];
bool vis[60];
struct node{
	int to,w;	
	node(int _to,int _w){
		to=_to;w=_w;
	}
	bool operator < (const node &a)const{
		return w>a.w;
	}
};
void djs(int s){
	dis[s]=0;
	priority_queue<node> q;
	q.push(node(s,0));
	while(!q.empty()){
		while(vis[q.top().to]&&!q.empty())q.pop();
		if(q.empty())break;
		int v=q.top().to,cost=q.top().w;
		q.pop();
		vis[v]=true;
		for(int pt=first[v];pt;pt=lst[pt].next){
			if(dis[lst[pt].to]>cost+lst[pt].w){
				dis[lst[pt].to]=cost+lst[pt].w;
				q.push(node(lst[pt].to,cost+lst[pt].w));
			}
		}
	}
}
char readch(){
	char ch;
	while(ch=getchar(),!isalpha(ch));
	return ch;
}
int main(){
	freopen("comehome.in","r",stdin);
	freopen("comehome.out","w",stdout);
	int m;scanf("%d",&m);
	char ch1,ch2;int cost;
	while(m--){
		ch1=readch();ch2=readch();
		scanf("%d",&cost);
		ch1=transfer(ch1);
		ch2=transfer(ch2);
		insert(ch1,ch2,cost);
		insert(ch2,ch1,cost);
	}
	memset(dis,63,sizeof(dis));
	djs(52);
	int ans=1<<25;int mark;
	for(int i=27;i<52;++i){
		if(dis[i]<ans){
			mark=i;
			ans=dis[i];
		}
	}
	printf("%c %d\n",'A'+mark-27,ans);
	fclose(stdin);fclose(stdout);
	return 0;
}