美文网首页信息学竞赛题解(IO题解)
BZOJ-2007: [Noi2010]海拔(平面最小割转对偶图

BZOJ-2007: [Noi2010]海拔(平面最小割转对偶图

作者: AmadeusChan | 来源:发表于2018-10-16 20:28 被阅读0次

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2007

机房快关了。。。贴了代码就滚回去了。。。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
 
using namespace std ;
 
#define MAXN 510
#define inf 0x7fffffff
#define MAXV MAXN * MAXN
 
struct edge {
    edge *next ;
    int t , d ;
} *head[ MAXV ] ;
 
void AddEdge( int s , int t , int d ) {
    edge *p = new( edge ) ;
    p -> t = t , p -> d = d , p -> next = head[ s ] ;
    head[ s ] = p ;
}
 
int node[ MAXN ][ MAXN ] , S , T , n , V = 0 ;
 
int dist[ MAXV ] ; bool f[ MAXV ] ;
 
struct cmp {
    bool operator(  )( int x ,int y ) {
        return dist[ x ] > dist[ y ] ;
    }
};
 
priority_queue< int , vector< int > , cmp >Q ;
 
int spfa(  ) {
    for ( int i = 0 ; i ++ < V ; ) dist[ i ] = inf , f[ i ] = true ;
    Q.push( S ) , dist[ S ] = 0 ;
    while ( ! Q.empty(  ) ) {
        int v = Q.top(  ) ; Q.pop(  ) ;
        if ( v == T || dist[ v ] > dist[ T ] ) return dist[ T ] ;
        if ( ! f[ v ] ) continue ; f[ v ] = false ;
        for ( edge *p = head[ v ] ; p ; p = p -> next ) if ( dist[ p -> t ] > dist[ v ] + p -> d ) {
            dist[ p -> t ] = dist[ v ] + p -> d ; f[ p -> t ] = true ; Q.push( p -> t ) ;
        }
    }
    return dist[ T ] ;
}
 
int main(  ) {
    scanf( "%d" , &n ) ;
    S = ++ V , T = ++ V ;
    for ( int i = 0 ; i ++ < n ; ) for ( int j = 0 ; j ++ < n ; ) node[ i ][ j ] = ++ V ;
    for ( int i = 0 ; i ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ;
        AddEdge( node[ 1 ][ i ] , T , x ) ;
    }
    for ( int i = 0 ; i ++ < n - 1 ; ) {
        for ( int j = 0 ; j ++ < n ; ) {
            int x ; scanf( "%d" , &x ) ;
            AddEdge( node[ i + 1 ][ j ] , node[ i ][ j ] , x ) ;
        }
    }
    for ( int i = 0 ; i ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ;
        AddEdge( S , node[ n ][ i ] , x ) ;
    }
    for ( int i = 0 ; i++ < n ; ) {
        int x ; scanf( "%d" , &x ) ; AddEdge( S , node[ i ][ 1 ] , x ) ;
        for ( int j = 0 ; j ++ < n - 1 ; ) scanf( "%d" , &x ) , AddEdge( node[ i ][ j ] , node[ i ][ j + 1 ] , x ) ;
        scanf( "%d" , &x ) ; AddEdge( node[ i ][ n ] , T , x ) ;
    }
    for ( int i = 0 ; i ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ; 
    }
    for ( int i = 0 ; i ++ < n - 1 ; ) for ( int j = 0 ; j ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ; AddEdge( node[ i ][ j ] , node[ i + 1 ][ j ] , x ) ;
    }
    for ( int i = 0 ; i ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ;
    }
    for ( int i = 0 ; i ++ < n ; ) {
        int x ; scanf( "%d" , &x ) ; 
        for ( int j = 0 ; j ++ < n - 1 ; ) scanf( "%d" , &x ) , AddEdge( node[ i ][ j + 1 ] , node[ i ][ j ] , x ) ;
        scanf( "%d" , &x ) ;
    }
    printf( "%d\n" , spfa(  ) ) ;
    return 0 ;
}

相关文章

  • BZOJ-2007: [Noi2010]海拔(平面最小割转对偶图

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2007 机...

  • 电路基础第二章

    图是节点和支路的集合 连通图,非连通图,分离度ρ/有向图,无向图/子图/平面图 节点的次数(度数)/路径→回路 割...

  • 4. 整数规划:割平面法python代码

    1. 从分支定界(branch and cut)到割平面(cutting plane) 割平面简单来说,就是添加约...

  • R 数据可视化 —— igraph 函数应用

    前言 igraph 提供了许多图论算法,例如我们熟知的最短路径、最大流最小割、最小生成树等。 我们针对下面的图,介...

  • 史墨华夏·夏史·大禹治水

    尧舜时代正值冰河时代后期。气候转暖,冰雪消融,海平面迅速升高,海水倒灌。《尚书·尧典》这样描写:“汤汤洪水方割,荡...

  • 离散数学期中复习大纲

    图论 边数 距离 (最短)圈长 完全图 完全二部图连通分支数 边连通度(最小割边集基数) 点连通度顶点次数 最大...

  • 2020-12-17

    任务内容 一、平面图(底层平面图、标准层平面图、屋顶平面图等任选两张绘制):比例1:100。 1、确定各房间的形状...

  • 支持向量机之SMO-------7

    上次详细的介绍了用最小二乘法求解结构风险最小化问题的分类支持向量机,并在文章最后给出了求解对偶问题的序列最小优化(...

  • 中山省立图书馆调研

    建筑有着一股历史的味道。复古,民国的风格 使用玻璃窗 采光 天井 正面 平面图 平面图 天井 植物 楼梯 平面图 平面图

  • 让手绘笔记有主次

    平面层次靠改线,变粗变双乱点线。 空间效果靠变图,透视阴影和光斑。 段落分区用两招,曲线闭合直线割。 上色只需三两...

网友评论

    本文标题:BZOJ-2007: [Noi2010]海拔(平面最小割转对偶图

    本文链接:https://www.haomeiwen.com/subject/igkkzftx.html