C++学习笔记:图论——拆点详解

news/2024/7/15 18:10:38 标签: 图论, 拆点

引言

拆点,玄学的东西,你值的拥有。。。


详解

拆点就是将一个图里的边权全部化为 1 ,就要将每一个点拆解为几个点,每个拆解后的点的边权为 1 

 一个图的邻接矩阵

\begin{matrix} 0 &2 &2 &0 &0 \\ 2& 0 & 1 & 0 &0 \\ 2& 1 & 0& 1 &3 \\ 0& 0 &0 &1 &0 \\ 0& 0 &3 &0 &0 \end{matrix}

其中最大的边权为 3 

则每一个点拆分为 i.1 , i.2 , i.3 的分点

分点先与自己相邻的分点相连,但要把 i.1 看为原来的点

即 1.1 与 1.2 连

1.2 与 1.3 连

拆完后的图为

点1 到 点2 的边权为 2 

则 1.2 与 2.1 连

点1 到 点3 的边权为 2 

则 1.2 与 3.1 连

以此慢慢连边。。。

最后所得的图为

但是,这个图该怎样构造呢???  我们是把原图的最大的边权作为每个点的分点的个数

那么这个图就有 (最大边权 * 原图点数) 这么多个点

这时候就要把分点看做一个单独的点

就设 1.1 为 点1,1.2 为点2 ,1.3 为 点3,以此类推,那 3.3 这个点应是 点几 呢,他们之间的规律是什么

不难发现对于 i.j 这个点,转化后为 点 ( i-1 ) * maxl + j (maxl 为最大边权)

因为每个原点有 maxl 个分点

则 i.1 就是 点 ( i-1 )*maxl,而 i.j 为原点 i 的第 j 个分点

所以 i.j 这个点,转化后为 点 ( i-1 ) * maxl + j


int rep( int x , int y ) {
    return maxl*(x-1) + y ;
}

 

 转化后的图为

然后就是将这个新图连结起来,先把 i.1 与 i.2 相连,i.2 与 i.3 相连

再将原图相连的点连接 ,如果原图点 i 与 j 的边权为 x,则 i.x 与 j.1 相连 

​
for(int i = 1 ; i <= N ; ++ i ) {//N表示点数
        for(int j = 1 ; j < maxl ; ++ j )//maxl最大边权
            G_after[ rep( i,j ) ][ rep( i,j+1 ) ] = 1 ;//G_after存储拆点后的图
        for(int j = 1 ; j <= N ; ++ j ) {
            if( G[i][j] != 0 )//判断原图是否相连
                G_after[ rep( i,G[i][j] )][ rep( j,1 )] = 1 ;//连边
        }//rep返回拆点后的点的编号
    }

​

然后就可以为所欲为了(嘿嘿嘿...)

/*         _    _____         _
           \`,""   ,'7"r-..__/ \
          ,'\/`, ,',','    _/   \
         /   \/ 7 / /     (   \ |
        J     \/ j  L______\  / |
        L   __JF"""/""\"\_,    /
        L,-"| O|  | O |  L_  _/
        F   \_ /  \__/   `-  /|
            .-'    `"""    ,' |          _..====.._
            \__/         r"_  A        ,' _..---.._`,
             `-.______,,-L// / \  ___,' ,'_..:::.. `,`,
                      /   / / / 7"    `-<""=:'  '':. \ \
                     |   <,' /  F  . i , \   `,    :T W I
                     |    \,'  /    >X<  |     \   :| |  L
                     \     `._/    ' ! ` |      I  :| |  G
                      \           \     /       |  :H T  |
                     __>-.__   __,-\   |        |  S P   |
                    /     /|   | \  \  \_       | 'A R   |
                   /   __/ |   |  \  \   \      K./ /   L
                  /   |    |   |  |  |   |     E/ /   ,'
                 |    \    |   |  |  |   |    // / _,'
        _________|     |   |   |  |  |   |   //_/-'
        \   __   |    /    |   | /   |   |  /="
        \\  \_\  \__,' \  /    |/   /    |
        \\\_____________\/     F___/     F
         \\| 计算机编程 |_____/   (_____/
          \/从入门到入土/
*/

用到拆点的题

1. 迷路[SCOI2009]

 


http://www.niftyadmin.cn/n/943118.html

相关文章

POJ1860,Currency Exchange(Bellman-Ford)

题意&#xff1a;有N种货币&#xff0c;有M个机构可以提供换币服务&#xff0c;每个机构只能提供2种货币的换币服务&#xff0c;以输入数据1 2 1.00 1.00(r1) 1.00(c1) 1.20(r2) 1.00(c2)为例&#xff0c;设最初有100个货币1&#xff0c;货币1转换为2后得到货币2的数量为&#…

bzoj 1465: 糖果传递

Description 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖…

POJ3259,Wormholes(并查集+Bellman-Ford)

这道题要求的是给定一个图&#xff0c;判断是否存在一个负环。 很容易就想到Bellman-Ford算法&#xff0c;但是此题所提供的图可能是不连通的&#xff0c;因此题中的图可能会分成几个子图&#xff0c;而Bellman-Ford只能够判断源点所在子图是否存在负环&#xff0c;其他子图由于…

bzoj 2190: [SDOI2008]仪仗队

Description 作为体育委员&#xff0c;C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵&#xff0c;为了保证队伍在行进中整齐划一&#xff0c;C君会跟在仪仗队的左后方&#xff0c;根据其视线所及的学生人数来判断队伍是否整齐(如下图)。      现在&…

POJ1502,MPI Maelstrom(最短路)

没看题&#xff0c;直接看输入输出&#xff0c;猜出了大概就是求1到其他点的最短路径&#xff0c;输出其中的最大者。 然而还是WA了很多次&#xff0c;错了很多奇奇怪怪的东西&#xff08;不知为啥在POJ刷题经常会遇到这种情况。。。&#xff09; 注意一下数据的输入与处理吧。…

POJ3660,Cow Contest(Floyd)

这道题是利用Floyd算法判断各顶点是否连通的一个变形。 设置一个d[i,j]数组&#xff0c;d[i,j]1表示i胜j&#xff0c;d[i,j]-1表示i负j&#xff0c;ij时d[i,j]赋为0&#xff08;其实没什么大的意义&#xff0c;也可以理解为自己跟自己不分胜负&#xff09;。另设置u[i],v[i]数组…

bzoj 1043: [HAOI2008]下落的圆盘

Description 有n个圆盘从天而降&#xff0c;后面落下的可以盖住前面的。求最后形成的封闭区域的周长。看下面这副图, 所有的红色线条的总长度即为所求. Input n ri xi y1 ... rn xn yn Output 最后的周长&#xff0c;保留三位小数 Sample Input 2 1 0 0 1 1 0Sample Output 10…

POJ2240,Arbitrage(Bellman-Ford)

题意大概就是给你一个有向图&#xff0c;让你判断是否存在正环&#xff08;图不一定连通&#xff09;。不一样的是&#xff0c;每个顶点都是一个字符串&#xff0c;不过不要紧&#xff0c;我们可以用一个map<string,int>&#xff0c;把他们改为整型数据。 代码如下&#…