【题目描述】

    农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。

【题目链接】

    https://www.luogu.org/problemnew/show/P1828

【算法】

    算出任意两个牧场间最短距离,枚举目的地,取最小值。floyd会超时,对每个点用spfa。

【代码】

 #include <bits/stdc++.h>
using namespace std;
struct edge{ int to,next,val; }e[];
int n,p,C,a,b,c,tot,ans=1e9,i,j;
int head[],rec[],d[][],v[];
void add(int from,int to,int val)
{
e[++tot].to=to,e[tot].val=val;
e[tot].next=head[from],head[from]=tot;
}
int main()
{
scanf("%d%d%d",&n,&p,&C);
for(i=;i<=n;i++) scanf("%d",&a),rec[a]++;
for(i=;i<=C;i++) scanf("%d%d%d",&a,&b,&c),add(a,b,c),add(b,a,c);
memset(d,0x3f,sizeof(d));
for(i=;i<=p;i++) {
memset(v,,sizeof(v));
queue<int> q;
d[i][i]=;
q.push(i); v[i]=;
while(q.size()) {
int x=q.front(); q.pop();
v[x]=;
for(j=head[x];j;j=e[j].next) {
int to=e[j].to,val=e[j].val;
if(d[i][to]>d[i][x]+val) {
d[i][to]=d[i][x]+val;
if(!v[to]) q.push(to),v[to]=;
}
}
}
}
for(i=;i<=p;i++) {
int tmp=;
for(j=;j<=p;j++)
tmp=tmp+d[i][j]*rec[j];
ans=min(ans,tmp);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. WebForm 分页、组合查询--2017年1月5日
  2. 0421 &amp; SX2016
  3. winform 多个label绑定一个事件
  4. 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法
  5. numpy.concatenate
  6. iframe跨域访问
  7. Linux_日志信息
  8. wrk 进程管理
  9. UI3_UITableViewDelete(多选)
  10. Prebrowsing
  11. 【转】vc中使用SendMessage正确发送自定义消息的方法--不错
  12. Mac下Mysql启动异常[&quot;ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/tmp/mysql.sock&#39; (2)&quot;]
  13. 体验魅力Cognos BI 10 系列,第1 部分: 第一次安装
  14. shell之路【第四篇】输入输出重定向
  15. Tomcat服务器顶层结构和启动过程【转】
  16. Asp.Net MVC-4-过滤器1:认证与授权
  17. 2.9 while循环
  18. Git - 生成 ssh key for Mac
  19. day 7-7 线程池与进程池
  20. 一个简单 JDK 动态代理的实例

热门文章

  1. Spring Security初识
  2. 如何解决MSVCR120.dll在Windows上缺少错误?
  3. sql优化-派生表与inner-join
  4. [洛谷2257]ZAP-Queries 题解
  5. 安装memcached和elasticsearch服务并systemctl管理
  6. volley简介
  7. Windows 搭建Hadoop 2.7.3开发环境
  8. Prototype js library
  9. Python编程:从入门到实践—列表
  10. 内存地址 Memory Management