首页 > 其他分享 >提高课图论总结

提高课图论总结

时间:2022-11-08 19:55:40浏览次数:35  
标签:总结 图论 get int 提高 cnt pos ++ path

Floyd

求无向图最小环问题

https://www.acwing.com/problem/content/346/

floyd是典型的插点算法,每次插入点k,为此,在点k被[插入前]可计算i-j-k这个环
即此时中间节点为:1~k-1,即我们已经算出了任意i<->j的最短道路,中间经过的节点可以为 (1,2,3,...,k-1)
我们只需枚举所有以k为环中最大节点的环即可。
pos[i][j]:i~j的最短路中经过的点是k(即由这个状态转移过来),且这个k是此路径中编号最大的点(除i,j)

const int N = 105;

int n, m;
int d[N][N], g[N][N];
int pos[N][N];
int path[N], cnt;

void get_path(int i, int j) {
    if (!pos[i][j]) return;

    int k = pos[i][j];
    get_path(i, k);
    path[cnt ++] = k;
    get_path(k, j);
}

int main() {
    cin >> n >> m;

    memset(g, 0x3f, sizeof g);
    while (m --) {
        int a, b, c; cin >> a >> b >> c;
        g[a][b] = g[b][a] = min(g[a][b], c);
    }

    int ans = INF;
    memcpy(d, g, sizeof d);
    for (int k = 1; k <= n; k ++) {
        // 枚举以k为最大编号的环
        for (int i = 1; i < k; i ++)
            for (int j = i + 1; j < k; j ++) 
                if ((LL)d[i][j] + g[i][k] + g[k][j] < ans) { // i->k->j->..->i
                    ans = d[i][j] + g[i][k] + g[k][j];

                    cnt = 0;
                    path[cnt ++] = k;
                    path[cnt ++] = i;
                    get_path(i, j);
                    path[cnt ++] = j;
                }

        for (int i = 1; i <= n; i ++)
            for (int j = 1; j <= n; j ++)
                if (d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j];
                    pos[i][j] = k;
                }
    }

    if (ans == INF) puts("No solution.");
    else {
        for (int i = 0; i < cnt; i ++) cout << path[i] << " \n"[i == cnt - 1];
    }
    return 0;
}

 

const int N = 105;

int n, m;
int d[N][N], g[N][N];
int pos[N][N];
int path[N], cnt;

void get_path(int i, int j) {
    if (!pos[i][j]) return;

    int k = pos[i][j];
    get_path(i, k);
    path[cnt ++] = k;
    get_path(k, j);
}

int main() {
    cin >> n >> m;

    memset(g, 0x3f, sizeof g);
    while (m --) {
        int a, b, c; cin >> a >> b >> c;
        g[a][b] = g[b][a] = min(g[a][b], c);
    }

    int ans = INF;
    memcpy(d, g, sizeof d);
    for (int k = 1; k <= n; k ++) {
        // 枚举以k为最大编号的环
        for (int i = 1; i < k; i ++)
            for (int j = i + 1; j < k; j ++) 
                if ((LL)d[i][j] + g[i][k] + g[k][j] < ans) { // i->k->j->..->i
                    ans = d[i][j] + g[i][k] + g[k][j];

                    cnt = 0;
                    path[cnt ++] = k;
                    path[cnt ++] = i;
                    get_path(i, j);
                    path[cnt ++] = j;
                }

        for (int i = 1; i <= n; i ++)
            for (int j = 1; j <= n; j ++)
                if (d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j];
                    pos[i][j] = k;
                }
    }

    if (ans == INF) puts("No solution.");
    else {
        for (int i = 0; i < cnt; i ++) cout << path[i] << " \n"[i == cnt - 1];
    }
    return 0;
}
View Code

 

标签:总结,图论,get,int,提高,cnt,pos,++,path
From: https://www.cnblogs.com/Leocsse/p/16870968.html

相关文章

  • 昨日操盘总结
    昨日,菜粕和螺纹钢的走势基本符合预判。交易结果虽然是小赚,但在具体的操作中,却是错误不断。因为没有安照操作计划走,所以连续犯了好几个明显的错误,晚上在复盘昨天的交易时,......
  • 数据测试总结
    问题:mysql 语法转hql语法过程遇到的问题:int类型和字符串类型比较大小,比如表中是int类型 10< '1'  或者  '10'>1 ,常见与where 后写法类......
  • 释放windows预留内存,增加在用CPU个数提高整机性能
    释放windows预留内存,增加在用CPU个数提高整机性能windows系统更新后或重装后,会预留一部分内存(大概2G)。如果本机内存比较小,这就很伤。而且,默认系统使用1个CPU在跑,这样计算的......
  • 11.8 总结
    11.8GZEZNOIP2022模拟测试赛(五十六)T1环:题目描述:对于一个0,1串有两种操作:整体向右移动x位将某个01变成10给你串的长度和1的个数让你构造l个串,满......
  • oracle case when 用法总结
    ​​Oracledbms_jobpackage用法小结​​ORACLECASEWHEN及SELECTCASEWHEN的用法  Case具有两种格式。简单Case函数和Case搜索函数。--简单case函数casesex......
  • Spring Boot面试题总结
    1、什么是SpringBoot描述:SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。大多数SpringBoot项目只需要很少的配置文件。2、Spring......
  • LPDDR4x 的 学习总结(6) - initialization & training
    1.为什么要initialization?本节介绍device的initialization从上节的device的结构可看出DIMM的两面有16个颗粒,颗粒的组织结构有T型(CA/CLK)。 T型拓扑T型拓扑的眼图......
  • android 经典笔记总结
    pro android media developing graphics,music,videoand richmedia apps for smartphones and tablets第一章 android introduction  pla......
  • Graphics Stack总结(四) 设置Mesa开发环境
    回顾上篇文章中我们提供了Mesasourcetree的概览,然后简介了几个主要的modules.现在我们将介绍setupmesa开发环境时会用到的几个小tips。DevelopmentenvironmentMesa......
  • 常用刷题网址——提高代码能力
    常用刷题网址——提高代码能力备份和总结1、leetcode英文网址:​​​https://leetcode.com/​​​中文网址:​​https://leetcode-cn.com/​​估计leetcode(力扣)大家都很熟......