bzoj3394:[Usaco2009 Jan]Best Spot 最佳牧场
Description
Input
第1行输入三个整数P,F C.之后F行每行输入一个整数表示一个贝茜喜欢的牧场.之后C行每行输入三个整数ai,bi,Ti,描述一条路.
Output
一个整数,满足题目要求的最佳牧场.如果有多个答案,输出编号最小的
Sample Input
13 6 15
11
13
10
12
8
1
2 4 3
7 11 3
10 11 1
4 13 3
9 10 3
2 3 2
3 5 4
5 9 2
6 7 6
5 6 1
1 2 4
4 5 3
11 12 3
6 10 1
7 8 7
Sample Output
10
请容忍这个样例输入,实在太长了,但是还是告诉大家一个好消息,最短路最简单易懂(有利必有弊,效率可(gan)怕(ren))的算法floyd登场了。
其思想又不得不提区间dp,十分相似,枚举中转点,起点,终点,跑一边,O(N^3),感人吧(小数据的最短路还是很好用的)
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int g[510][510],n,f,m,l[510],u,v,w,ans,mn=INT_MAX; 4 int main() 5 { 6 scanf("%d%d%d",&n,&f,&m); 7 memset(g,0x3f,sizeof(g)); 8 for(int i=1;i<=f;i++) 9 scanf("%d",&l[i]); 10 for(int i=1;i<=m;i++) 11 scanf("%d%d%d",&u,&v,&w),g[u][v]=g[v][u]=w; 12 for(int i=1;i<=n;i++) 13 g[i][i]=0; 14 for(int k=1;k<=n;k++) 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=n;j++) 17 if(g[i][k]+g[k][j]<g[i][j]) 18 g[i][j]=g[i][k]+g[k][j]; 19 for(int i=1;i<=n;i++) 20 { 21 int sum=0; 22 for(int j=1;j<=f;j++) 23 if(g[i][l[j]]!=0x3f3f3f3f)sum+=g[i][l[j]]; 24 if(sum<mn) 25 mn=sum,ans=i; 26 } 27 printf("%d",ans); 28 }