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 }

 

posted @ 2018-08-08 11:16  蒟蒻--lichenxi  阅读(152)  评论(0编辑  收藏  举报