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