【gmoj】【最小生成树】间谍派遣
题目
解题思路
出任务费用最小的肯定出(设A的出任务费用较小,A→B,让B出,B→A,让A出,传递等价,所以A出更优)
因为所有的信息都要获得,说明构成一个连通图,即跑最小生成树(我用的prim)
代码
#include<iostream>
#include<cstdio>
using namespace std;
bool p[1010];
int n,f,ans=1e6,b[1010],d[1010],a[1010][1010];
void work(int x)
{
for (int i=1;i<=n;i++)
d[i]=min(a[x][i],b[i]); //要不别人传递,要不自己出任务
p[x]=1;
while (1)
{
int mi=1000000,w=0;
for (int i=1;i<=n;i++)
if (d[i]<mi&&!p[i])
{
mi=d[i];
w=i;
}
if (w==0) break;
p[w]=1;
ans+=d[w];
for (int i=1;i<=n;i++)
d[i]=min(d[i],a[w][i]);
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for (int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
if (ans>b[i])
{
ans=b[i];
f=i;
}
}
work(f);
printf("%d",ans);
return 0;
}