HDU1853 & 蜜汁建图+KM模板
题意:
给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好.
SOL:
本来还想tarjan什么的,就是不能往二分图上靠。。。然后看了二分图的建图觉得非常神奇。我们可以把一个点O拆成两个点O和O‘,发现一个点i如果能到点j,那么我们就将i与j’建一条边,然后构成整张图后S与S‘分别为两个集合来跑KM。正确性现在还有点晕,先挖个坑
领悟到建图的重要性,做得题太少还是太年轻。
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 84 85 86 87 88 | #include<cstdio> #include<cstring> #include<algorithm> #define INF 1e9 using namespace std; const int maxn=100+10; struct Max_Match { int n,W[maxn][maxn]; int Lx[maxn],Ly[maxn]; bool S[maxn],T[maxn]; int left[maxn]; bool match( int i) { S[i]= true ; for ( int j=1;j<=n;j++) if (Lx[i]+Ly[j]==W[i][j] && !T[j]) { T[j]= true ; if (left[j]==-1 || match(left[j])) { left[j]=i; return true ; } } return false ; } void update() { int a=1<<30; for ( int i=1;i<=n;i++) if (S[i]) for ( int j=1;j<=n;j++) if (!T[j]) a=min(a, Lx[i]+Ly[j]-W[i][j]); for ( int i=1;i<=n;i++) { if (S[i]) Lx[i] -=a; if (T[i]) Ly[i] +=a; } } int solve( int n) { this ->n=n; memset (left,-1, sizeof (left)); for ( int i=1;i<=n;i++) { Lx[i]=Ly[i]=0; for ( int j=1;j<=n;j++) Lx[i]=max(Lx[i], W[i][j]); } for ( int i=1;i<=n;i++) { while ( true ) { for ( int j=1;j<=n;j++) S[j]=T[j]= false ; if (match(i)) break ; else update(); } } int ans=0; for ( int i=1;i<=n;i++) { if (W[left[i]][i]==-INF) return -1; ans += W[left[i]][i]; } return -ans; } }KM; int main() { int n,m; while ( scanf ( "%d%d" ,&n,&m)==2) { for ( int i=1;i<=n;i++) for ( int j=1;j<=n;j++) KM.W[i][j]=-INF; while (m--) { int u,v,w; scanf ( "%d%d%d" ,&u,&v,&w); KM.W[u][v]=max(KM.W[u][v],-w); } printf ( "%d\n" ,KM.solve(n)); } return 0; } |
Sometimes it s the very people who no one imagines anything of. who do the things that no one can imagine.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 7 个最近很火的开源项目「GitHub 热点速览」
· 博客园2025新款「AI繁忙」系列T恤上架
· DeepSeekV3:写代码很强了
· 记一次 .NET某固高运动卡测试 卡慢分析
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提