zoukankan      html  css  js  c++  java
  • 【Atcoder】ARC083 D

    【算法】图论,最短路?

    【题意】原图为无向连通图,现给定原图的最短路矩阵,求原图最小边权和,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;
    }
    View Code
  • 相关阅读:
    pycharm2017.3.7的安装
    SVN Working Copy xxx locked 并 cleanup失败之解
    Lua查找字符串注意
    Lua运算符
    Python操作Excel
    项目中碰到的Ajax相关的问题记录
    线程的相关概念
    val()用法和value的区别
    JSON数组对象和JSON字符串的转化,map和JSON对象之间的转化
    算法复杂度相关概念
  • 原文地址:https://www.cnblogs.com/onioncyc/p/7535216.html
Copyright © 2011-2022 走看看