AcWing 1127. 香甜的黄油
农夫John发现了做出全威斯康辛州最甜的黄油的方法:糖。
把糖放在一片牧场上,他知道 N 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。
当然,他将付出额外的费用在奶牛上。
农夫John很狡猾,就像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。
他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。
农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。
给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。
数据保证至少存在一个牧场和所有牛所在的牧场连通。
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> pp; int n,k,m,ans=0x3f3f3f3f; int a[505]; int fir[805],to[2905],nxt[2905],w[2905],num; int dis[805][805]; bool vis[805]; void add(int x,int y,int z){nxt[++num]=fir[x];fir[x]=num;to[num]=y;w[num]=z;} priority_queue<pp,vector<pp>,greater<pp> > q; void dj(int bg) { memset(vis,0,sizeof(vis)); q.push(make_pair(0,bg)); dis[bg][bg]=0; while(q.size()){ int u=q.top().second; q.pop(); if(vis[u]) continue; vis[u]=1; for(int i=fir[u],v;v=to[i],i;i=nxt[i]) { if(dis[bg][v]>dis[bg][u]+w[i]) { dis[bg][v]=dis[bg][u]+w[i]; q.push(make_pair(dis[bg][v],v)); } } } } int main() { scanf("%d%d%d",&k,&n,&m); memset(dis,0x3f,sizeof(dis)); for(int i=1;i<=k;i++)scanf("%d",&a[i]); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c);add(b,a,c); } for(int i=1;i<=n;i++) { dj(i); int t=0; for(int j=1;j<=k;j++)t+=dis[i][a[j]]; if(t>0) ans=min(ans,t); } printf("%d\n",ans); return 0; }