<small id="yahdu"></small>

    1. <mark id="yahdu"></mark>

      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;
      }
      相关文章
      相关标签/搜索
      4887铁算盘四肖中特香港马会开码结果直播 开奖结果-香港最快开奖现场直播-王中王资料 一肖中特-2018年管家婆彩图 今天-王中王中特网资料大全 白小姐 增城市| 筠连县| 普格县| 临沂市| 玛曲县| 汶上县| 毕节市| 九寨沟县| 德化县| 同仁县| 景宁| 黄山市| 澎湖县| 沙坪坝区| 田林县| 金湖县| 改则县| 通河县| 淮阳县| 泾源县| 安国市| 大田县| 磐安县| 西平县| 三明市| 望城县| 湘潭县| 新晃| 高碑店市| 南昌市| 云梦县| 察雅县| 民县| 孟连| 儋州市| 乌什县| 元朗区| 荃湾区| 连城县| 石林| 永福县| 惠州市| 乃东县| 清新县| 淮滨县| 来凤县| 仲巴县| 丰原市| 伊宁县| 博湖县| 托克逊县| 永城市| 汝城县| 视频| 峨山| 北安市| 什邡市| 崇义县| 罗定市| 贵南县| 张家口市| 广西| 福鼎市| 南乐县| 平舆县| 张家港市| 德江县| 蕲春县| 满洲里市| 三明市| 嘉义市| 上高县| 仪陇县| 胶南市| 碌曲县| 嘉善县| 吉安县| 湘潭市| 安国市| 永康市| 兰西县| 金华市| 佛教| 辽源市| 宣城市| 和硕县| 浦县| 山阳县| 梁河县| 桦川县| 岳阳市| 青铜峡市| 达日县| 榆社县| 吉林市| 德州市| 上蔡县| 耒阳市| 青阳县| 沽源县| 塘沽区| 威信县| 莆田市| 襄汾县| 璧山县| 萍乡市| 繁峙县| 辰溪县| 达孜县| 宁河县| 博客| 武夷山市| 临泉县| 涟水县| 板桥市| 新泰市| 土默特右旗| 含山县| 盘山县| 商南县| 周宁县| 比如县| 无极县| 台前县| 九寨沟县| 资兴市| 夏津县| 中牟县| 驻马店市| 南京市| 北票市| 南通市| 滦南县| 静宁县| 湖南省| 柘荣县| 台湾省| 邛崃市| 大厂| 静宁县| 孝义市| 竹溪县| 大埔区| 乳山市| 临沂市| 易门县| 老河口市| 五常市| 兴安盟| 黄大仙区| 淅川县| 丰镇市| 雅江县| 普定县| 黑山县| 若羌县| 兴安县| 太白县| 大同县| 开原市| 江阴市| 张家港市| 绥中县| 互助| 吴堡县| 大渡口区| 大余县| 井冈山市| 略阳县| 衡阳县| 和林格尔县| 称多县| 镶黄旗| 洪泽县| 崇阳县| 三原县| 晋州市| 安平县| 乳源| 宜城市| 宁都县| 牡丹江市| 会东县| 内黄县| 晋城| 句容市| 迁安市| 化州市| 哈尔滨市| 双桥区| 大名县| 永丰县| 南溪县| 玛纳斯县| 察隅县| 天水市| 杭锦旗| 北川| 惠安县| 四平市| 芷江| 哈尔滨市| 海口市| 依安县| 大英县| 深泽县| 涿鹿县| 星子县| 玉溪市| 阿荣旗| 海伦市| 大宁县| 东辽县| 休宁县| 丰镇市| 灵丘县| 千阳县| 桂东县| 浦东新区| 临泽县| 汉源县| 绥芬河市| 商丘市| 天津市| 台前县| 霸州市| 长汀县| 察隅县| 家居| 墨脱县| 佛坪县| 保山市| 汝城县| 平潭县| 赤峰市| 尼木县| 武隆县| 喀喇沁旗| 宣汉县| 民和| 太白县| 吉林市| 衡山县| 普定县| 特克斯县| 乌苏市| 尤溪县| 定陶县| 嘉禾县| 蓬安县| 惠州市| 闽侯县| 慈溪市| 奉化市| 太仆寺旗| 通海县| 卫辉市| 都匀市| 洪泽县| 罗平县| 景谷| 博乐市| 利辛县| 巫溪县| 永登县| 凤台县| 大丰市| 调兵山市| 垣曲县| 西青区| 琼结县| 黔西县| 建德市| 横山县| 沁阳市| 乌拉特后旗| 综艺| 台东市| 乐陵市| 临高县| 玉屏| 丰原市| 务川| 阿克陶县| 宜兰市| 盐池县| 三原县| 万山特区| 甘洛县| 焦作市| 东光县| 思南县| 洪湖市| 任丘市| 开远市| 扬州市| 苗栗市| 临泉县| 仁寿县| 拜城县| 灵寿县| 海盐县| 遂平县| 井冈山市| 阿尔山市| 卢湾区| 翼城县| 崇阳县| 交口县| 泸定县| 陵川县| 合江县| 南皮县| 澄迈县| 海兴县| 凤阳县| 三穗县| 华阴市| 林芝县| 吉木乃县| 昌黎县| 涿鹿县| 白山市| 漳平市| 河南省| 依兰县| 鄯善县| 高台县| 津市市| 柳林县| 江达县| 荆门市| 朝阳区| 新沂市| 富民县| 昆明市| 左贡县| 兴海县| 吐鲁番市| 丰台区| 平罗县| 略阳县| 柞水县| 宁德市| 区。| 临泉县| 呼图壁县| 宝清县| 井研县| 寻甸| 怀仁县| 平乐县| 永昌县| 呼伦贝尔市| 舒城县| 汪清县| 上杭县| 肇源县| 侯马市| 乌鲁木齐市| 霍城县| 江安县| 凌源市| 石河子市| 醴陵市| 怀安县| 德庆县| 富川| 天津市| 兖州市| 伊宁县| 大同县| 图们市| 陆川县| 潜江市| 平舆县| 达拉特旗| 天水市| 武山县| 泾源县| 岑巩县| 桃江县| 锡林郭勒盟| 库车县| 韶山市| 成安县| 苍南县| 同仁县| 北宁市| 衡东县| 龙川县| 平凉市| 东乡| 涟源市| 攀枝花市| 汉中市| 怀集县| 上虞市| 东丽区| 彝良县| 德化县| 海城市| 双桥区| 阿拉善右旗| 小金县| 道真| 绥中县| 潍坊市| 隆子县| 怀安县| 九台市| 西乌珠穆沁旗| 赤壁市| 林周县| 陆良县| 荣昌县| 福州市| 崇明县| 宁晋县| 庆阳市| 寿光市| 泰兴市| 揭阳市| 宁河县| 定陶县| 新龙县| 霍林郭勒市| 陆川县| 沅陵县| 武定县| 赫章县| 县级市| 文安县| 府谷县| 老河口市| 濮阳县| 甘南县| 普定县| 东丰县| 澄江县| 滁州市| 纳雍县| 逊克县| 阳山县| 奉贤区| 怀集县| 阿坝县| 嘉义县| 军事| 青神县| 永顺县| 鲁山县| 齐齐哈尔市| 长子县| 延边| 揭西县| 塔河县| 德江县| 固阳县| 内黄县| 台南县| 偏关县| 清流县| 德庆县| 尼木县| 西安市| 尼玛县| 仁寿县| 通山县| 宜阳县| 额尔古纳市| 焦作市| 侯马市| 霍城县| 福贡县| 徐汇区| 千阳县| 鲜城| 榆社县| 图们市| 连州市| 黑水县| 新营市| 屯门区| 白河县| 武定县| 铜梁县| 辰溪县| 龙游县| 临猗县| 格尔木市| 靖西县| 杭锦旗| 崇左市| 龙江县| 宜君县| 调兵山市| 连州市| 乌审旗| 金湖县| 全椒县| 云安县| 永顺县| 遵义市| 清远市| 肇庆市| 娄底市| 鱼台县| 广昌县| 伊金霍洛旗| 安徽省| 都兰县| 舒城县| 东乡| 丹江口市| 安远县| 沙坪坝区| 大连市| 泰州市| 鹰潭市| 隆回县| 海南省| 祁阳县| 曲水县| 赫章县| 防城港市| 兰考县| 修水县| 临西县| 田东县| 土默特右旗| 新闻| 桐城市| 南宫市| 宁都县| 高陵县| 论坛| 陵川县| 泉州市| 松潘县| 安西县| 鹤岗市| 磐石市| 土默特左旗| 郯城县| 南开区| 东源县| 根河市| 湘西| 鹿邑县| 高台县| 铜山县| 中江县| 西青区| 宜城市| 望谟县| 武清区| 鸡泽县| 托克托县| 东平县| 龙山县| 河南省| 巨野县| 新郑市| 长汀县| 铅山县| 铜鼓县| 黄骅市| 怀集县| 清苑县| 吴川市| 元朗区| 东台市| 河池市| 汶川县| 乳源| 娄烦县| 延寿县| 津市市| 柘城县| 平度市| 栖霞市| 昔阳县| 翁牛特旗| 徐水县| 涪陵区| 长宁区| 四平市| 耿马| 蒙城县| 红桥区| 惠来县| 砀山县| 资兴市| 天柱县| 宽甸| 湟源县| 藁城市| 舒兰市| 枞阳县| 凌源市| 开原市| 天祝| 贵港市| 城口县| 图们市| 台东县| 施甸县| 集安市| 防城港市| 达拉特旗| 广丰县| 聂拉木县| 齐河县| 德保县| http://www.thyrxj.fit http://wap.hftefq.fit http://m.bm1961xonitorz.fit http://wap.chsiuv.fit http://dsfkhh.fit http://wap.jpxuxh.fit http://olruqg.fit http://www.spabko.fit http://lzuzch.fit http://www.unlosy.fit http://tejgafit http://www.bm1961xixz.fit http://www.quybtv.fit http://m.kvaaoe.fit http://www.gqkkyj.fit http://m.npveyz.fit http://m.aqelts.fit http://m.hvvlcu.fit