BZOJ3394: [Usaco2009 Jan]Best Spot 最佳牧场

3394: [Usaco2009 Jan]Best Spot 最佳牧场

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 11  Solved: 9
[Submit][Status]

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

HINT

Source

Silver

题解:

这么sb的题为什么这么少人A。。。

floyed过不了就用n次floyed或者dijkstra

然后n^2暴力枚举就好了。。。

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 1000
14 #define maxm 100000
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 1000000007
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
29     return x*f;
30 }
31 struct edge{int go,next,w;}e[2*maxm];
32 int n,m,k,s,tot,a[maxn],b[maxn],q[maxn],d[maxn][maxn],head[maxn];
33 bool v[maxn];
34 void ins(int x,int y,int z)
35 {
36     e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
37 }
38 void insert(int x,int y,int z)
39 {
40     ins(x,y,z);ins(y,x,z);
41 }
42 void spfa(int s)
43 {
44     for(int i=1;i<=n;++i) d[s][i]=inf;
45     memset(v,0,sizeof(v));
46     int l=0,r=1,x,y;q[1]=s;d[s][s]=0;
47     while(l!=r)
48     {
49         x=q[++l];if(l==maxn-1)l=0;v[x]=0;
50         for(int i=head[x];i;i=e[i].next)
51          if(d[s][x]+e[i].w<d[s][y=e[i].go])
52          {
53              d[s][y]=d[s][x]+e[i].w;
54              if(!v[y]){v[y]=1;q[++r]=y;if(r==maxn-1)r=0;}
55          }
56     }
57 }
58 int main()
59 {
60     freopen("input.txt","r",stdin);
61     freopen("output.txt","w",stdout);
62     n=read();k=read();m=read();
63     for1(i,k)a[i]=read();
64     for1(i,m)
65     {
66         int x=read(),y=read(),z=read();
67         insert(x,y,z);
68     }
69     for1(i,n)spfa(i);
70     int ans=1;
71     for1(i,n)
72     {
73         for1(j,k)b[i]+=d[i][a[j]];
74         if(b[i]<b[ans])ans=i;
75     }
76     printf("%d\n",ans);
77     return 0;
78 }

时间: 2024-10-10 14:28:06

BZOJ3394: [Usaco2009 Jan]Best Spot 最佳牧场的相关文章

bzoj3396[Usaco2009 Jan]Total flow 水流*

bzoj3396[Usaco2009 Jan]Total flow 水流 题意: 求无环图的最大流.边数≤700. 题解: 管它有没有环.注意本题的节点标号既有大写字母,也有小写字母. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #de

3396: [Usaco2009 Jan]Total flow 水流

3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 179  Solved: 73[Submit][Status] Description Input 第1行输入N,之后N行每行描述一条水管,前两个英文字母表示水管的两端(大小写字母是不一样的),后一个整数表示水管的流量,流量不会超过1000. Output 一个整数,表示总流量. Sample Input 5 A B 3 B C 3

bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分

1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 665  Solved: 227[Submit][Status] Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数:从牛棚_1到牛棚_i+1并且避免从牛棚1到牛棚i+1最短路经上最后一条牛

【BZOJ 1576】 [Usaco2009 Jan]安全路经Travel

1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 676  Solved: 231 [Submit][Status] Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数:从牛棚_1到牛棚_i+1并且避免从牛棚1到牛棚i+1最短路经上最后一条

1574: [Usaco2009 Jan]地震损坏Damage

1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 232[Submit][Status][Discuss] Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1..P. C(1 <= C <= 100,000)条双向路经

bzoj 1574: [Usaco2009 Jan]地震损坏Damage

Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1..P. C(1 <= C <= 100,000)条双向路经联接这些牛棚,编号为1..C. 路经i连接牛棚a_i和b_i (1 <= a_i<= P;1 <= b_i <= P).路经可能连接a_i到它自己,两个牛棚之间可能有多条路经.农庄在编号为1的牛棚. N (1 <

BZOJ1576 [Usaco2009 Jan]安全路经Travel

首先用Dijkstra做出最短路生成树,设dis[p]为1到p点的最短路长度 对于一条不在生成树上的边u -> v,不妨设fa为u.v的lca 则一fa到v的路径上的任意点x都可以由u达到,走的方式是1 -> fa -> u -> v -> x,dis'[x] = dis[u] + dis(u, v) + dis[v] - dis[x] 于是可以用dis[u] + dis(u, v) + dis[v]更新fa到v的路径上的所有点 链剖一下,线段树lazytag就好了,连pus

bzoj3393 [Usaco2009 Jan]Laserphones 激光通讯

Description Input 第1行输入w和H,之后W行H列输入地图,图上符号意义如题目描述. Output 最少的对角镜数量. Sample Input 7 8 ....... ...... C ......* *****.* ....*.. ....*.. .C ..*.. ....... Sample Output 3 求拐点数最小 直接搜索是不行的,因为可能出现一个点当前被更新的状态并不是它最优的状态 所以像spfa那样允许多次入队,这样虽然慢一点但是没有后效性,而且这么小的数据也

bzoj 1575: [Usaco2009 Jan]气象牛Baric

Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N(1 <= M_i <= 1,000,000). Betsy想找出一部分测量结果来总结整天的气压分布. 她想用K(1 <= K <= N)个数s_j (1 <= s_1 < s_2 < ... < s_K <= N)来概括所有测量结果. 她想限制如下的误差: 对于任何测量结果子集,每一个非此