luogu P1529 回家 Bessie Come Home
阿新 • • 發佈:2017-07-04
輸入輸出 span pri int 意思 nbsp urn 長度 end
題目描述
現在是晚餐時間,而母牛們在外面分散的牧場中。 農民約翰按響了電鈴,所以她們開始向谷倉走去。 你的工作是要指出哪只母牛會最先到達谷倉(在給出的測試數據中,總會有且只有一只最快的母牛)。 在擠奶的時候(晚餐前),每只母牛都在她自己的牧場上,一些牧場上可能沒有母牛。 每個牧場由一條條道路和一個或多個牧場連接(可能包括自己)。 有時,兩個牧場(可能是字母相同的)之間會有超過一條道路相連。 至少有一個牧場和谷倉之間有道路連接。 因此,所有的母牛最後都能到達谷倉,並且母牛總是走最短的路徑。 當然,母牛能向著任意一方向前進,並且她們以相同的速度前進。 牧場被標記為‘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
folyd
建邊時要取min不然會被卡
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define N 410 int map[N][N]; bool have[N]; int n,ans=0x7fffffff;char A,B,who; int main() { memset(map,0x3f,sizeof(map)); scanf("%d",&n); int t; for(int i=1;i<=n;i++) { cin>>A>>B>>t; //cout<<A<<" "<<B<<endl; if(A>=‘A‘&&A<=‘Z‘)have[A]=1; if(B>=‘A‘&&B<=‘Z‘)have[B]=1; map[A][B]=min(map[A][B],t); map[B][A]=min(map[A][B],map[B][A]); } for(int k=‘A‘;k<=‘z‘;k++) for(int i=‘A‘;i<=‘z‘;i++) for(int j=‘A‘;j<=‘z‘;j++) map[i][j]=min(map[i][j],map[i][k]+map[k][j]); for(int i=‘A‘;i<=‘Y‘;i++) if(have[i]&&map[i][‘Z‘]<ans) ans=map[i][‘Z‘], who=(char)i; printf("%c %d\n",who,ans); return 0; }
luogu P1529 回家 Bessie Come Home