1. 程式人生 > >洛谷——P1529 回家 Bessie Come Home

洛谷——P1529 回家 Bessie Come Home

-o spa 存在 包括 告訴 getch 復制 翻譯 會有

P1529 回家 Bessie Come Home

題目描述

現在是晚餐時間,而母牛們在外面分散的牧場中。 農民約翰按響了電鈴,所以她們開始向谷倉走去。 你的工作是要指出哪只母牛會最先到達谷倉(在給出的測試數據中,總會有且只有一只最快的母牛)。 在擠奶的時候(晚餐前),每只母牛都在她自己的牧場上,一些牧場上可能沒有母牛。 每個牧場由一條條道路和一個或多個牧場連接(可能包括自己)。 有時,兩個牧場(可能是字母相同的)之間會有超過一條道路相連。 至少有一個牧場和谷倉之間有道路連接。 因此,所有的母牛最後都能到達谷倉,並且母牛總是走最短的路徑。 當然,母牛能向著任意一方向前進,並且她們以相同的速度前進。 牧場被標記為‘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: 復制
5
A d 6
B d 3
C e 9
d Z 8
e Z 3
輸出樣例#1: 復制
B 11

說明

翻譯來自NOCOW

USACO 2.4

Floyd跑最短路,然後在輸出最短的道路

註意:有重邊!!!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 61
#define maxn 9999999
using namespace
std; char ch; int n,m,x,y,z,ans,dis[N][N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar(); return x*f; } int main() { n=60,m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=maxn*(i!=j); for(int i=1;i<=m;i++) { cin>>ch; if(ch>=A&&ch<=Z) x=ch-A+1; else x=ch-a+27; cin>>ch; if(ch>=A&&ch<=Z) y=ch-A+1; else y=ch-a+27; z=read(); dis[x][y]=min(dis[x][y],z); dis[y][x]=dis[x][y]; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); ans=maxn; for(int i=1;i<=25;i++) if(dis[i][26]<ans) { ch=i+A-1; ans=dis[i][26]; } cout<<ch<<" "<<ans; return 0; }

洛谷——P1529 回家 Bessie Come Home