洛谷 P1194 买礼物

来源:互联网 发布:申请淘宝api接口流程 编辑:程序博客网 时间:2024/04/27 16:18

题目来源https://www.luogu.org/problem/show?pid=1194


先设立一个虚构的点,该点与所有点均有边相连,且边权值为A,即商品的价格。


这样保证至少先买一件商品,再优惠。


存储每一条边,用Kruskal算法计算最小生成树的所有边权总和。


#include <algorithm>#include <iostream>#include <cstring>#include <sstream>#include <cstdlib>#include <string>#include <cstdio>#include <cctype>#include <vector>#include <ctime>#include <cmath>#include <stack>#include <queue>#include <set>#include <map>using namespace std;int g[501][501]={0};const int maxn=2e5;int v[maxn],u[maxn],w[maxn],r[maxn],p[maxn];const int cmp(const int i,const int j){return w[i]<w[j];}int find(int x){return p[x]==x?x:p[x]=find(p[x]);}int main(){    ios::sync_with_stdio(false);    int a,b;cin>>a>>b;    for(int i=1;i<=b;i++)    {        for(int j=1;j<=b;j++)        {            cin>>g[i][j];        }    }    int d=0;    for(int i=1;i<=b;i++)    {        for(int j=1;j<i;j++)        {            if(g[i][j]!=0)            {                v[++d]=i;u[d]=j;                w[d]=g[i][j];            }        }        w[++d]=a;        v[d]=i;u[d]=b+1;    }    b++;    for(int i=1;i<=d;i++)r[i]=i;    for(int i=1;i<=b;i++)p[i]=i;    sort(r+1,r+1+d,cmp);    int ans=0;    for(int i=1;i<=d;i++)    {        int e=r[i];        int x=find(v[e]);        int y=find(u[e]);        if(x!=y)        {            p[x]=y;            ans+=min(w[e],a);        }    }    cout<<ans;    return 0;}


0 0
原创粉丝点击