几乎是一道模板的最短路问题,但我们为了记录答案的最小值,可以暴力枚举从1-n作为出发点,记录下每个牧场有多少头奶牛,然后求最短路,答案就是1-n号牧场最短路*该牧场奶牛数量之和,不断取最小值就行。这道题在洛谷上用spfa可以AC,用floyd会TLE 3个点,用不加优化dijkstra也许会TLE 3个,这里把三个代码都贴上来,以供参考。
AC 100:spfa
#include
#include
#include
#include
#include
using namespace std;
const int maxn=810;
const int maxm=1460;
int n,p,m;
int head[maxn],nnext[maxm*2],to[maxm*2],length[maxm*2],team[maxn],dis[maxn];
int tot,cow[510],cnt[maxn],s=0,t=0;
bool b[maxn];
int ans=1e9,q=0;
void add(int x,int y,int l)
{
tot++;
nnext[tot]=head[x];
head[x]=tot;
to[tot]=y;
length[tot]=l;
}
void spfa(int x)
{
memset(team,0,sizeof(team));
memset(b,false,sizeof(b));
q=0,s=0,t=0;
for(int i=1;i<=p;i++)
{
dis[i]=1e9;
}dis[x]=0;
team[t]=x;
t++;
b[x]=true;
while(s!=t)
{
int now=team[s];
s++;
s%=p;
b[now]=false;
for(int i=head[now];i;i=nnext[i])
{
int y=to[i];
if(dis[y]>dis[now]+length[i])
{
dis[y]=dis[now]+length[i];
if(b[y]==false)
{
team[t]=y;
t++;
t%=p;
b[y]=true;
}
}
}
}
for(int i=1;i<=p;i++)
{
if(cnt[i]!=0)
{
q+=dis[i]*cnt[i];
}
//cout<>n>>p>>m;
for(int i=1;i<=n;i++)
{
cin>>cow[i];
cnt[cow[i]]++;
}
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=p;i++)
{
spfa(i);
}
cout<
70分 Floyd:
#include
#include
#include
#include
using namespace std;
const int maxn=810;
const int maxm=1460;
int cow[510],cnt[maxn],dis[maxn][maxn];
int n,p,m,ans=1e9,q=0;
void floyd(int x)
{
q=0;
for(int i=1;i<=p;i++)
{
q+=dis[x][i]*cnt[i];
}
ans=min(ans,q);
}
int main()
{
cin>>n>>p>>m;
for(int i=1;i<=n;i++)
{
cin>>cow[i];
cnt[cow[i]]++;
}
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
if(i==j) dis[i][j]=0;
else dis[i][j]=1e9;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
dis[x][y]=z;
dis[y][x]=z;
}
for(int k=1;k<=p;k++)
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=1;i<=p;i++)
{
floyd(i);
}
cout<
70分dijkstra:
#include
#include
#include
#include
#include
using namespace std;
const int maxn=810;
const int maxm=1460;
int dis[maxn],cow[510],cnt[maxn];
bool b[maxn];
int e[maxn][maxn];
int ans=1e9,q=0,minn,u;
int n,m,p;
void dijkstra(int x)
{
q=0;
for(int i=1;i<=p;i++)
{
dis[i]=e[x][i];
// cout<>n>>p>>m;
for(int i=1;i<=n;i++)
{
cin>>cow[i];
cnt[cow[i]]++;
}
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
if(i==j) e[i][j]=0;
else e[i][j]=1e9;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
e[x][y]=z;
e[y][x]=z;
}
for(int i=1;i<=p;i++)
{
dijkstra(i);
}
cout<