bzoj4349: 最小树形图&&bzoj2260: 商店购物
双倍经验大法吼
昨天发现不会最小属性图&朱刘算法啊
吓得我赶紧补了一发
朱刘算法模板题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <algorithm> #define N 55 #define M 2505 using namespace std; struct edge{ int from,adj,next; double len; edge(){} edge( int _from, int _adj, int _next, double _len):from(_from),adj(_adj),next(_next),len(_len){} } e[M]; int n,g[N],m; void AddEdge( int u, int v, double w){ e[++m]=edge(u,v,g[u],w);g[u]=m; } double in[N]; int prep[N]; int vis[N],stamp; int bl[N],cnt; double directed_MST(){ double ret=0; e[0].adj=0; for (;;){ memset (in,127, sizeof (in)); memset (prep,0, sizeof (prep)); for ( int u=1;u<=n;++u) for ( int i=g[u];i;i=e[i].next) if (e[i].len<in[e[i].adj]) in[e[i].adj]=e[i].len,prep[e[i].adj]=u; for ( int i=1;i<=n;++i) if (prep[i]) ret+=in[i]; memset (vis,0, sizeof (vis));vis[0]=stamp=1; memset (bl,0, sizeof (bl));cnt=0; for ( int i=1;i<=n;++i) if (!vis[i]){ int u=i; ++stamp; for (;!vis[u];u=prep[u]) vis[u]=stamp; if (vis[u]==stamp){ ++cnt; for (;!bl[u];u=prep[u]) bl[u]=cnt; } } if (!cnt) return ret; for ( int i=1;i<=n;++i) if (!bl[i]) bl[i]=++cnt; int m0=m; memset (g,0, sizeof (g));m=1; for ( int i=2;i<=m0;++i) if (bl[e[i].from]!=bl[e[i].adj]) AddEdge(bl[e[i].from],bl[e[i].adj],e[i].len-in[e[i].adj]); n=cnt; } } int need[N]; double mincost[N]; int main(){ scanf ( "%d" ,&n);++n; memset (g,0, sizeof (g));m=1; int u,v,m0; double tmp; for ( int i=1;i<n;++i){ scanf ( "%lf%d" ,&mincost[i],&need[i]); if (need[i]) AddEdge(n,i,mincost[i]); } scanf ( "%d" ,&m0); while (m0--){ scanf ( "%d%d%lf" ,&u,&v,&tmp); if (need[u]&&need[v]){ AddEdge(u,v,tmp); mincost[v]=min(mincost[v],tmp); } } double sum=0; for ( int i=1;i<=n;++i) if (need[i]) sum+=mincost[i]*(need[i]-1); printf ( "%.2lf\n" ,sum+directed_MST()); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步