【Atcoder】ARC083 D - Restoring Road Network
【算法】图论,最短路?
【题意】原图为无向连通图,现给定原图的最短路矩阵,求原图最小边权和,n<=300。
【题解】要求最小边权和下,原图的所有边一定是所连两端点的最短路。
那么现在将所有最短路作为边加入原图,考虑删边。
对于(u,v),若存在点w使得(u,v)=(u,w)+(w,v),则(u,v)可以删去。(btw,若是>则无解)
复杂度O(n^3)。
#include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read(){ char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t; } /*------------------------------------------------------------*/ const int inf=0x3f3f3f3f,maxn=310; int n,map[maxn][maxn],f[maxn][maxn]; int abs(int x){return x>0?x:-x;} int main(){ n=read(); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=read(),f[i][j]=map[i][j]; bool ok=1; for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ for(int k=1;k<=n;k++)if(i!=k&&j!=k){ if(map[i][j]>map[i][k]+map[k][j])ok=0; if(map[i][j]==map[i][k]+map[k][j])f[i][j]=f[j][i]=0; } } } long long ans=0; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans+=f[i][j]; if(ok)printf("%lld",ans/2);else printf("-1"); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 在外漂泊的这几年总结和感悟,展望未来
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?