• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594

            POJ 3613 Cow Relays---Floyd+矩陣相乘

            Posted on 2011-05-02 17:39 Uriel 閱讀(776) 評(píng)論(0)  編輯 收藏 引用 所屬分類: POJ圖論

            這是在DY大牛第六期專題里列出的題目之一.

            話說(shuō)搞ACM也2年多了, 竟然用矩陣乘法+Floyd的題目都還沒有做過(guò)... 上周的組隊(duì)賽遇到一道題才聽說(shuō)... (沒有拜讀matrix67的神文... 檢討下... )

            /*
            POJ 3613 Cow Relays

            -------Classify: Floyd+矩陣乘法
            ----Description: 求從S到T恰好經(jīng)過(guò)K條邊(可重復(fù)走)的最短路
            -----------------K<=1e6, m<100(邊數(shù))
            ---Sample Input:

            2 6 6 4----------//K m s t
            11 4 6-----------//length x<->y
            4 4 8
            8 4 9
            6 6 8
            2 6 9
            3 8 9

            --Sample Output:

            10

            -----Time Limit: 1000Ms
            ---------Source: USACO 2007 November Gold
            -------Solution: 

                By Solution Report

                01鄰接矩陣A的K次方C=A^K,C[i][j]表示i點(diǎn)到j(luò)點(diǎn)正好經(jīng)過(guò)K條邊的路徑數(shù)

                      對(duì)應(yīng)于這道題,對(duì)鄰接圖進(jìn)行K次floyd之后,C[i][j]就是點(diǎn)i到j(luò)正好經(jīng)過(guò)K條邊的最短路


            ---------Status: AC C++ 532Ms
            -----------Date: 2011.05.02
            ------Reference: 
            http://hi.baidu.com/aconly/blog/item/23fb73acc1d874004b36d634.html
            -----------Code: 
            */


            #include
            <stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #define N 1010
            #define INF 0x3f3f3f3f
            typedef 
            int M[N][N];

            int k, m, s, t, v;
            int ans[N][N], adj[N][N], vis[N], vtx[N], dis[N][N], tp[N][N];

            void floyd(M c, M a, M b) {
                
            int i, j, k;
                
            for (k = 0; k < v; ++k)
                    
            for (i = 0; i < v; ++i)
                        
            for (j = 0; j < v; ++j)
                            
            if (c[vtx[i]][vtx[j]] > a[vtx[i]][vtx[k]] + b[vtx[k]][vtx[j]])
                                c[vtx[i]][vtx[j]] 
            = a[vtx[i]][vtx[k]] + b[vtx[k]][vtx[j]];
            }


            void copy(M a, M b) {
                
            int i, j;
                
            for (i = 0; i < v; ++i)
                    
            for (j = 0; j < v; ++j) {
                        a[vtx[i]][vtx[j]] 
            = b[vtx[i]][vtx[j]];
                        b[vtx[i]][vtx[j]] 
            = INF;
                    }

            }


            void BS(int k) {
                
            while (k) {
                    
            if (k & 1{
                        floyd(dis, ans, adj);
                        copy(ans, dis);
                    }

                    floyd(tp, adj, adj);
                    copy(adj, tp);
                    k 
            >>= 1;
                }

            }


            int main() {
                
            int i, j, x, y, w;
                scanf(
            "%d %d %d %d"&k, &m, &s, &t);
                
            for (i = 0; i <= 1001++i) {
                    
            for (j = 0; j <= 1001++j) {
                        adj[i][j] 
            = INF;
                        tp[i][j] 
            = INF;
                        dis[i][j] 
            = INF;
                        ans[i][j] 
            = INF;
                    }

                    ans[i][i] 
            = 0;
                }

                v 
            = 0;
                memset(vis, 
            0sizeof(vis));
                
            for (i = 0; i < m; ++i) {
                    scanf(
            "%d %d %d"&w, &x, &y);
                    
            if (!vis[x]) {
                        vis[x] 
            = 1;
                        vtx[v
            ++= x;
                    }

                    
            if (!vis[y]) {
                        vis[y] 
            = 1;
                        vtx[v
            ++= y;
                    }

                    
            if (adj[x][y] > w)
                        adj[x][y] 
            = adj[y][x] = w;
                }

                BS(k);
                printf(
            "%d\n", ans[s][t]);
                
            return 0;
            }
            久久福利片| 久久综合欧美成人| 日韩精品久久久久久免费| 亚洲∧v久久久无码精品| 99久久免费国产特黄| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品亚洲一区二区三区浴池| 亚洲国产精品无码久久久秋霞2| 国产99精品久久| 麻豆精品久久久久久久99蜜桃| 久久发布国产伦子伦精品| 久久www免费人成精品香蕉| 人妻无码αv中文字幕久久琪琪布| 一本伊大人香蕉久久网手机| 精品无码久久久久国产动漫3d| 免费观看久久精彩视频| 久久午夜无码鲁丝片秋霞| 91精品国产综合久久四虎久久无码一级| 久久国产美女免费观看精品| 午夜精品久久久久久久| 最新久久免费视频| 51久久夜色精品国产| 国产精品禁18久久久夂久| 国产美女亚洲精品久久久综合| 久久av免费天堂小草播放| 9191精品国产免费久久| 97超级碰碰碰久久久久| 欧美一区二区三区久久综| 99精品久久精品一区二区| 99久久国产亚洲综合精品| 日韩美女18网站久久精品| 九九久久精品国产| 久久国产精品二国产精品| 亚洲一本综合久久| 91久久成人免费| 国产精品久久久天天影视香蕉 | 亚洲天堂久久久| 久久精品国产99国产精品| 久久国产成人精品国产成人亚洲| 狠狠色丁香久久综合婷婷| 久久噜噜电影你懂的|