[題解]洛谷P1194 買禮物
阿新 • • 發佈:2019-02-04
main href problem struct class string 題解 == std
原題:傳送門
如果兩個物品之間存在優惠關系就連一條邊,註意值為0不要連邊
然後再加一個節點0,往點1~B連權為A的邊
然後求一遍最小生成樹即可
代碼:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; int a,b,family[510]; struct edge{ int u,v,w; }e[134750]; int cmp(edge aa,edge bb){return aa.w<bb.w; } int m=0; void build(int u,int v,int w){ m++; e[m].u=u;e[m].v=v;e[m].w=w; } int find(int x){ if(family[x]==x)return x; return family[x]=find(family[x]); } int ans=0,tot=0; int main(){ scanf("%d%d",&a,&b); for(int i=1;i<=b;i++)for(int j=1;j<=b;j++){ int k; scanf("%d",&k); if(k!=0&&i<j)build(i,j,k); } for(int i=1;i<=b;i++) build(0,i,a); for(int i=0;i<=b;i++) family[i]=i; sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++){int f1=find(e[i].u),f2=find(e[i].v); if(f1!=f2){ family[f1]=f2; ans+=e[i].w; tot++; if(tot==b) break; } } printf("%d",ans); return 0; }
[題解]洛谷P1194 買禮物