题解 P1828 【香甜的黄油 Sweet Butter】
香甜的奶油
这个题似乎没有vector的dij,我来补一个
2019.08.03补充之前挂了的图片QwQ
首先,坦白讲,我先把数据构了一个图看看样例中是一个菱形的图,像这样
如果泥萌想做更多图的话,戳进去吧
那么就很显然了,从3->4,边权为5,从2->4,边权为3,所以3+5=8,样例输出了8.
so,我们需要让他跑一个最短路,pos数组记录当前点的位置,deep数组记录当前点的深度
如果要学习堆优化的dij,看一下这个blog吧,虽然不是我的,但也是一个dalao的题解
详细见代码注释(莫抄)
#include <bits/stdc++.h>
using namespace std;
struct point{//记录一个点的两项性质,to和val
int to,val;
};
int n,p,c;//见题意
int pos[810],deep[810];//见上面解释
int u,v,w;//输入的三个数
int ans=0x7fffffff;//求最小值,ans初始化为最大值
vector<point> side[810];//堆优化+存图
inline void dijkstra(int x){//最短路开始啦!
queue<int> q;
q.push(x);
deep[x]=0;
while(!q.empty()){
int to=q.front();
q.pop();
for(int i=0;i<side[to].size();i++){
point t=side[to][i];
if(deep[t.to]>deep[to]+t.val){//比它小就更新答案
deep[t.to]=deep[to]+t.val;
q.push(t.to);//循环的队列
}
}
}
}
int main(){
cin>>n>>p>>c;//输入
for(int i=1;i<=n;i++) cin>>pos[i];//输入奶牛们的位置
while(c--){
cin>>u>>v>>w;//输入
point t;//定义一个需要更新位置的结构体
t.to=v;
t.val=w;
side[u].push_back(t);//两次建图
t.to=u;
side[v].push_back(t);
}
for(int i=1;i<=p;i++){
memset(deep,0x3f,sizeof(deep));//每次要更新深度
dijkstra(i);//跑最短路
int sum=0;
for(int i=1;i<=n;i++)
sum+=deep[pos[i]];
ans=min(ans,sum);//取最小值
}
while(1)
cout<<ans<<'\n';//输出答案即可
return 0;//OK结束
}
码字不易,求通过,蟹蟹啦