poj3613-floyd+邻接矩阵乘法

        参考于:08年论文:俞华程《矩阵乘法在信息学中的应用》


        图邻接矩阵上的乘法:

                     图的邻接矩阵可以唯一地表示一张图,并且有很多神奇的性质。接下来我们 将研究邻接矩阵上的矩阵乘法。

                首先,我们来看一下最简单的情况,一张N个点的无向无权图。如果点a和 点b连边,那么邻接矩阵G[a,b] = G[b,a] = 1,否则都等于0。考虑邻接矩阵自 乘,即G2:

                          G2 [a,b] = N ∑ i=1 G[a,i]G[i,b]                                    (9) 


                 上式中,G[a,i],G[i,b]的值或者等于0或者等于1。易知当且仅当G[a,i], G[i,b]都是1的时候值为1,即如果从点a到点i、点i到b都有边,那么值为1。 而G2 [a,b]的值就等于值为1的项数,也就是从点a到点b经过1个中间点的路径条 数。我们继续考虑G3:

                          G3 [a,b] =N ∑ i=1N ∑ j=1G[a,i]G[i,j]G[j,b]                 (10)


                和G2很相似,G[a,i]G[i,j]G[j,b] = 1当且仅当G[a,i] = G[i,j] = G[j,b] = 1,也就是说a?i?j?b组成一条路经。
        那么G3 [a,b]的值就是从点a到点b经过2个 中间点的路径条数。从另一个方面来说,G3 = G2G,从点a到点b经过2个中间 点的路径中,第二个中间点是i的路径条数恰好为G2 [a,i]G[i,b],从这里也可 以说明上一个结论。那么更一般的,Gk [a,b]是否就等就a到b经过k ?1个中间 点也就是长度为k的路径条数呢?答案是肯定的。和前面的推导很相似,可以 使用归纳法证明,Gk = Gk?1G,那么

                          Gk [a,b] =N ∑ i=1Gk?1 [a,i]G[i,b]                              (11)


                其中Gk?1 [a,i]就是从a到i长度为k?1的路径条数,G[i,b]则表示了i到b是否 有路径,两者相乘恰好就是从a到b长度为k的路径上倒数第二个点为i的路径条 数。当k = 0时,G0为单位矩阵,G0 [a,a] = 1也符合a到a有一条长度为0的路 径。前面的证明当中并没有用到任何无向图的信息,因此这个结论也适用于有 向图。

                  那么对于有重边的图,我们只需要把G[a,b]改为表示点a,b之间重边的条 数即可。证明和前面的几乎一样,此处就不在赘述。而对于有向图的自环, 不需要特殊考虑。对于无向图的自环,我们通常是把G[a,a]加上2,这样在计 算Gk的时候这条边就被算成2条不同的边,如果只加上1,又会不满足矩阵里所 有元素和等于边数两倍的性质。需要怎样应具体情况具体分析。



        poj3613:

        Cow Relays
        Time Limit: 1000MS   Memory Limit: 65536K
        Total Submissions: 7357   Accepted: 2887

        Description

        For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout the pasture.

        Each trail connects two different intersections (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000), each of which is the termination for at least two trails. The cows know the lengthi of each trail (1 ≤ lengthi  ≤ 1,000), the two intersections the trail connects, and they know that no two intersections are directly connected by two different trails. The trails form a structure known mathematically as a graph.

        To run the relay, the N cows position themselves at various intersections (some intersections might have more than one cow). They must position themselves properly so that they can hand off the baton cow-by-cow and end up at the proper finishing place.

        Write a program to help position the cows. Find the shortest path that connects the starting intersection (S) and the ending intersection (E) and traverses exactly N cow trails.

        Input

        * Line 1: Four space-separated integers: NTS, and E
        * Lines 2..T+1: Line i+1 describes trail i with three space-separated integers: lengthi , I1i , and I2i

        Output

        * Line 1: A single integer that is the shortest distance from intersection S to intersection E that traverses exactly N cow trails.

        Sample Input

        2 6 6 4
        11 4 6
        4 4 8
        8 4 9
        6 6 8
        2 6 9
        3 8 9

        Sample Output

        10

        Source


        题目大意:

                       给定一张M条边的无向带权图,求从起点S到终点E恰好经过K条边的最短 路径。2≤ M ≤100,2≤ K ≤1000000。保证每个连边的点度至少为2。 


        题目思路:

                     有了前面矩阵乘法的概念,所以我们不妨设ans[i][j]^k表示为i->j经过k条边的最短路,而应为k很大,所以我们要用到矩阵快速幂,而对于题目给的点我们可以离散化下这样最大就只有100个点了,我们初始时用map[i][j]来保存地图,这里求矩阵的乘我们可以借用floyd,我们知道floyd的原理是更新以k为中间点的最短路,而我们的邻接矩阵的乘G[i][j]*G[i][j] 也就是找中间的k使得i->k和k->j

        都有路而对于最短路矩阵乘我们可以在遍历k时取个最短的,也就是c[i][j]=min(a[i][k]+b[k][j],1<=k<=n)a,b为两个矩阵如果a是经过x条边b是经过y条边那么c就是经过x+y条边的最短路,这个很好想到,所以最后面我们只需将map跑k遍floyd就是答案,但是k太大,所以要二分矩阵也就是矩阵快速幂!


        AC代码:


        #include<cstring>
        #include<cstdio>
        
        #define min(x,y) (x<y?x:y)
        
        const int inf = 0x3f3f3f3f;
        
        class MatrixFloyd{
        public:
        
            int n,m,s,t,k;
            int ans[205][205],tmp[205][205],mp[205][205],dis[205][205],v[1005];
        
            void init(){
                n=0;
                memset(v,-1,sizeof(v));
                for(int i=0;i<200;i++){
                    for(int j=0;j<200;j++)
                        ans[i][j]=tmp[i][j]=mp[i][j]=dis[i][j]=inf;
                    ans[i][i]=0;
                }
            }
        
            void in(){
                init();
                scanf("%d%d%d%d",&k,&m,&s,&t);
                while(m--){
                    int w,x,y;scanf("%d%d%d",&w,&x,&y);
                    if(v[x]==-1)v[x]=n++;                //将点离散化
                    if(v[y]==-1)v[y]=n++;
                    mp[v[x]][v[y]]=mp[v[y]][v[x]]=min(mp[v[x]][v[y]],w);
                }
                sove();
                printf("%d\n",ans[v[s]][v[t]]);
            }
        
            void floyd(int c[][205],int a[][205],int b[][205]){
                for(int k=0;k<n;k++)
                    for(int i=0;i<n;i++)
                        for(int j=0;j<n;j++)
                            c[i][j]=min(c[i][j],a[i][k]+b[k][j]);
            }
        
            void sove(){
                while(k){
                    if(k&1){               //二进制位为1
                        floyd(dis,ans,mp);              //用dis保存ans和mp相乘的矩阵,即c=a+b
                        memcpy(ans,dis,sizeof(ans));    //赋值给ans
                        memset(dis,0x3f,sizeof(dis));   //在初始化dis
                    }
                    floyd(tmp,mp,mp);
                    memcpy(mp,tmp,sizeof(mp));            //mp表示的是mp^2^n  n为二进制长度
                    memset(tmp,0x3f,sizeof(tmp));
                    k>>=1;
                }
            }
        
        
        }mf;
        
        int main()
        {
            mf.in();
            return 0;
        }
        相关文章
        相关标签/搜索
        香港马会免费资枓大全香港开奖结果_香港马会2019开奖结果_2019 最快开奖记录结果_小鱼儿玄机2站开奖 开奖结果 武宣县| 宝山区| 绍兴市| 长治县| 靖边县| 渑池县| 新平| 阿城市| 永福县| 河北省| 宝鸡市| 陇川县| 普格县| 吉首市| 萝北县| 龙山县| 碌曲县| 南靖县| 色达县| 绥阳县| 拉孜县| 兴宁市| 越西县| 贵南县| 永宁县| 精河县| 涟水县| 炎陵县| 青龙| 柳江县| 涿州市| 武宁县| 射阳县| 颍上县| 锡林郭勒盟| 湟源县| 澳门| 永春县| 天台县| 包头市| 公主岭市| 玉林市| 九台市| 饶平县| 通州区| 景德镇市| 湖口县| 阳新县| 邓州市| 旌德县| 咸宁市| 长兴县| 台中县| 伽师县| 尉氏县| 铁岭市| 康马县| 蓬莱市| 武安市| 高平市| 麦盖提县| 瑞安市| 环江| 健康| 尤溪县| 香港| 屯昌县| 溧水县| 吴忠市| 贵南县| 鄱阳县| 榆社县| 济源市| 文成县| 原平市| 扎兰屯市| 嵩明县| 当涂县| 屏东县| 佛冈县| 景宁| 广水市| 收藏| 淄博市| 吉隆县| 德兴市| 马尔康县| 公主岭市| 鹤庆县| 鲁山县| 霍州市| 浦县| 永修县| 航空| 彰武县| 黄山市| 大关县| 舟曲县| 金坛市| 芜湖县| 建湖县| 光泽县| 沂水县| 怀宁县| 怀柔区| 新闻| 宝坻区| 荥经县| 黎城县| 颍上县| 武宁县| 镇康县| 长白| 武城县| 建昌县| 靖边县| 简阳市| 虹口区| 海南省| 鸡泽县| 茂名市| 辽源市| 德阳市| 肥乡县| 丹阳市| 临湘市| 丘北县| 中西区| 饶阳县| 同心县| 桂林市| 安吉县| 津南区| 衡阳市| 成安县| 安丘市| 永清县| 建湖县| 松阳县| 江永县| 汕尾市| 大城县| 临猗县| 镇安县| 民和| 定日县| 青州市| 依安县| 乐山市| 社会| 中卫市| 探索| 马山县| 桂平市| 合山市| 蚌埠市| 福建省| 阿尔山市| 南江县| 乌鲁木齐县| 钟山县| 武邑县| 渝北区| 元谋县| 怀远县| 巫溪县| 冕宁县| 门源| 黑山县| 陈巴尔虎旗| 濮阳县| 宁河县| 九龙坡区| 新闻| 烟台市| 邢台县| 双峰县| 吐鲁番市| 桐城市| 宁阳县| 龙川县| 琼结县| 施甸县| 习水县| 普格县| 南溪县| 遂宁市| 老河口市| 临夏县| 栖霞市| 武威市| 乐清市| 屏山县| 上高县| 镇远县| 客服| 凤冈县| 香格里拉县| 隆尧县| 昭觉县| 宜良县| 白玉县| 英山县| 宜章县| 朝阳市| 绵阳市| 大洼县| 公安县| 仪陇县| 银川市| 彰武县| 句容市| 太仓市| 郧西县| 玉环县| 陆良县| 会昌县| 黑河市| 西安市| 桑植县| 科技| 关岭| 盐津县| 大厂| 兴业县| 万山特区| 台南市| 青冈县| 怀远县| 阿拉善盟| 拉萨市| 金乡县| 建平县| 资中县| 临江市| 墨脱县| 新乡县| 兴化市| 兴文县| 子长县| 牙克石市| 曲周县| 清苑县| 新竹县| 都兰县| 田林县| 克东县| 美姑县| 长海县| 南召县| 文化| 永胜县| 屯门区| 巴彦淖尔市| 桐柏县| 湖南省| 大悟县| 耒阳市| 随州市| 安福县| 新河县| 龙陵县| 平阴县| 苗栗县| 应城市| 萨嘎县| 桦川县| 苍梧县| 石河子市| 石林| 抚松县| 尼木县| 莎车县| 曲沃县| 榆中县| 景泰县| 博湖县| 汕头市| 苍山县| 泰来县| 泸水县| 甘肃省| 新民市| 宁津县| 新安县| 永顺县| 儋州市| 镇远县| 田东县| 紫金县| 介休市| 昌江| 乌拉特前旗| 吴桥县| 巧家县| 阿荣旗| 佛学| 宁强县| 稷山县| 塔河县| 慈溪市| 罗源县| 乳山市| 上栗县| 涞水县| 平谷区| 永顺县| 建德市| 岳普湖县| 晋江市| 金堂县| 莱西市| 万全县| 永定县| 团风县| 大邑县| 兴隆县| 方山县| 沈阳市| 博野县| 白城市| 鄂托克旗| 岢岚县| 阿拉善右旗| 曲水县| 万安县| 璧山县| 鄯善县| 呼和浩特市| 象山县| 荥经县| 台中市| 满城县| 陵水| 丰都县| 弋阳县| 修武县| 方山县| 自治县| 英德市| 武邑县| 威远县| 双城市| 孝感市| 瓦房店市| 杨浦区| 文登市| 岳池县| 勐海县| 大英县| 平度市| 察雅县| 龙海市| 五大连池市| 博湖县| 昌乐县| 伽师县| 全椒县| 汝城县| 邛崃市| 湖南省| 济源市| 大足县| 长沙县| 密云县| 大方县| 淮北市| 印江| 北宁市| 金阳县| 成武县| 教育| 长海县| 沅江市| 乳源| 错那县| 兴和县| 伊春市| 连城县| 白山市| 隆林| 漳州市| 大化| 磴口县| 雅江县| 双辽市| 竹北市| 沅陵县| 泸西县| 南和县| 衡东县| 佛冈县| 陆丰市| 东莞市| 苍梧县| 深圳市| 灵宝市| 淮北市| 都兰县| 高密市| 古交市| 资阳市| 肇东市| 永胜县| 南宫市| 余庆县| 依兰县| 南陵县| 尉氏县| 武平县| 休宁县| 历史| 饶平县| 漳浦县| 西青区| 谷城县| 包头市| 桂东县| 德钦县| 开原市| 通州市| 班戈县| 左权县| 塔河县| 新和县| 武穴市| 崇明县| 南投县| 贵州省| 吉安县| 青河县| 陆良县| 怀宁县| 绿春县| 洪泽县| 南溪县| 潼关县| 拉萨市| 革吉县| 礼泉县| 砚山县| 吉首市| 寻乌县| 博客| 长岭县| 玛纳斯县| 凤凰县| 芷江| 车险| 饶河县| 海丰县| 台北市| 霸州市| 四平市| 天祝| 资源县| 浦县| 华安县| 九江市| 敖汉旗| 贵州省| 连城县| 屏边| 徐州市| 两当县| 包头市| 桃源县| 佛冈县| 宜君县| 高陵县| 股票| 麦盖提县| 重庆市| 昂仁县| 元谋县| 永善县| 邹平县| 吕梁市| 晋宁县| 阿拉善右旗| 贡嘎县| 呼和浩特市| 甘泉县| 肇东市| 凌源市| 双牌县| 靖边县| 博湖县| 若羌县| 湛江市| 安阳县| 肇东市| 天全县| 清新县| 临猗县| 大悟县| 区。| 高雄市| 鸡西市| 凤庆县| 寿阳县| 上犹县| 孟州市| 随州市| 宝丰县| 定远县| 盘锦市| 石林| 龙游县| 凤庆县| 东安县| 正阳县| 甘谷县| 铜山县| 宝丰县| 道真| 尼勒克县| 赣州市| 四会市| 获嘉县| 通城县| 六安市| 阜平县| 图木舒克市| 富平县| 张家界市| 新营市| 仙居县| 遵义县| 东山县| 吴堡县| 嘉兴市| 镇远县| 云龙县| 习水县| 达州市| 定安县| 孝昌县| 广元市| 东平县| 台东市| 衡阳市| 平定县| 蓬溪县| 门头沟区| 滕州市| 皋兰县| 新民市| 三门县| 延吉市| 栾川县| 卢氏县| 奈曼旗| 南皮县| 湟中县| 宁明县| 伊金霍洛旗| 广平县| 老河口市| 余姚市| 德钦县| 武清区| 临颍县| 宣武区| 夏邑县| 驻马店市| 凤庆县| 安仁县| 长沙市| 金溪县| 扎鲁特旗| 武安市| 连平县| 铁岭市| 金堂县| 峨边| 内黄县| 体育| 平原县| 丹棱县| 临城县| 图们市| 阜阳市| 颍上县| 黑河市| 左权县| 乌恰县| 姚安县| 正阳县| 射阳县| 江口县| 南陵县| 马关县| 浙江省| 安西县| 海兴县| 临海市| 宁国市| 镇平县| 榆中县| 开化县| 南通市| 海林市| 焉耆| 武宣县| 乐亭县| 西丰县| 绵竹市| 鹿泉市| 福州市| 揭西县| 和政县| 库伦旗| 洪泽县| 孟津县| http://www.hz0j4r5vo.fun http://jx1870killv.fun http://www.hz0j3r1vo.fun http://m.jx1870exportv.fun http://m.hz0j4r9vo.fun http://www.jx1870handv.fun http://www.jx1870greyv.fun http://m.jx1870enhancev.fun http://m.jx1870gunv.fun http://www.jx1870faxv.fun http://m.jx1870landscapev.fun http://www.jx1870leadv.fun http://m.jx1870fillv.fun http://m.jx1870fearv.fun http://wap.jx1870fundv.fun http://jx1870izprovev.fun http://wap.jx1870icev.fun http://m.jx1870izagev.fun