• <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>
            posts - 14,  comments - 11,  trackbacks - 0
            題目大意:
               去掉給定的邊,看每一個點是否能從別的點到達!
                如果能夠到達,則求出對于每一個點到其他所有的點最短距離之和,將這些和相加就是最后的結果

               解題思路:
                  對每一個點求一次單源最短路,然后求和,相加的到最后的結果……
                  但,算一下時間復雜度: 復雜度是O(M*N*M)。由于M*N*M=3000*100*3000=9*108,不可能AC

                  所以,需要我們另辟他徑。網上有說建什么最短路徑樹,這個我不懂……
                  我的思路是:引用前面的思路,對每一個點求一次最短路,并將其求和,保存在一個數組里頭,定為sum[i],i表示著一個點到所有其他點最短路之和。并將這些和相加 ans = sum[1]  + …… + sum[n]; 
                  然后,刪除一條邊,其頂點暫定為u,v,對這條邊的一個頂點u在一次求最短路,如果這個點,不能到達這條邊的另一個點v,則 直接輸出INF
                  如果,能夠到達,則對v也求一次最短路,對于u,v兩點來說,求得u到每一個點的最短路之和sum_u,求得v到每一個點的最短路之和sum_v,
                  最后結果為: ans = ans + sum_u + sum_v - sum[u] - sum[v];
                  ans為最后答案(千萬記住是每一組的,因為有m條邊)
                  具體看代碼:
            http://acm.hdu.edu.cn/showproblem.php?pid=2433
            時間是 953ms
                     
              1 #include <iostream>
              2 #include <queue>
              3 using namespace std;
              4 const int SIZE = 102;
              5 const int INF = 1 << 30;
              6 struct node
              7 {
              8        int v, w, next;
              9 }map[SIZE * SIZE];
             10 
             11 int head[SIZE], use;
             12 int num[SIZE * 30];
             13 int sum[SIZE];
             14 
             15 void add(int u, int v, int w)
             16 {
             17      map[use].v = v;
             18      map[use].w = w;
             19      map[use].next = head[u];
             20      head[u] = use ++;
             21 }
             22 void init()
             23 {
             24      use = 0;
             25      memset(head, -1sizeof(head));
             26      memset(sum, 0sizeof(sum));
             27 }
             28 
             29 queue <int> q;
             30 bool vist[SIZE];
             31 int dis[SIZE];
             32 
             33 int spfa(int s)
             34 {
             35      while (!q.empty()) q.pop();
             36      
             37      for (int i = 0; i < SIZE ; i ++)  dis[i] = INF;
             38      
             39      memset(vist, falsesizeof(vist));
             40      dis[s] = 0;
             41      vist[s] = true;
             42      q.push(s);
             43      int ans = 0;
             44      while (!q.empty()) 
             45      {
             46            int u = q.front();
             47            q.pop();
             48            vist[u] = false;
             49            ans += dis[u];
             50            for (int i = head[u]; i != -1; i = map[i].next)
             51            {
             52                int v = map[i].v;
             53                if (dis[v] > dis[u] + map[i].w)
             54                {
             55                   dis[v] = dis[u] + map[i].w;
             56                   if (!vist[v])
             57                   {
             58                      vist[v] = true;
             59                      q.push(v);
             60                   }
             61                }
             62            }
             63      }
             64      return ans;
             65 }
             66 int main()
             67 {
             68      int n, m;
             69      while (scanf("%d%d"&n, &m) != EOF)
             70      {
             71            int i, j, k;
             72            int u, v;
             73            init();
             74            memset(num, 0sizeof(num));
             75            for (i = 1; i <= m; i++)
             76            {
             77                scanf("%d%d"&u, &v);
             78                num[i] = use;
             79                add(u, v, 1);
             80                add(v, u, 1);
             81            }
             82            int ans = 0;
             83            for (i = 1; i <= n; i++)  
             84            {
             85                sum[i] = spfa(i);
             86                ans += sum[i];
             87            }
             88            int tmp = ans;
             89            for (i = 1; i <= m; i++)
             90            {
             91                map[num[i]].w = INF;
             92                map[num[i]^1].w = INF;
             93                
             94                ans = tmp;
             95                ans += spfa(map[num[i]].v);
             96                
             97                if (dis[map[num[i]^1].v] == INF) 
             98                {
             99                   printf("INF\n");
            100                }
            101                else 
            102                {
            103                     ans += spfa(map[num[i]^1].v);
            104                     ans = ans - sum[map[num[i]].v] - sum[map[num[i]^1].v];
            105                     printf("%d\n", ans);
            106                }
            107                map[num[i]].w = 1;
            108                map[num[i]^1].w = 1;
            109            }
            110      }
            111 return 0;
            112 }
            113 

               
            posted on 2012-03-09 15:35 路修遠 閱讀(1874) 評論(8)  編輯 收藏 引用 所屬分類: 路修遠

            FeedBack:
            # re: HDU 2433 最短路
            2012-09-22 10:29 | ff
            這樣貌似不對啊啊  回復  更多評論
              
            # re: HDU 2433 最短路
            2012-09-22 10:47 | 路修遠
            要不在看看有什么地方不同 ?@ff
              回復  更多評論
              
            # re: HDU 2433 最短路
            2012-09-22 10:50 | 路修遠
            不知道你說的是哪里有問題 ,能不能指出來 咯? @ff
              回復  更多評論
              
            # re: HDU 2433 最短路
            2012-12-03 21:20 | attacker
            你這樣可以AC????刪除<U,V>不僅改變 u,v最短路啊、、、求解  回復  更多評論
              
            # re: HDU 2433 最短路
            2012-12-04 10:56 | 路修遠
            @attacker
            the i-th line is the new SUM after the i-th road is destroyed  回復  更多評論
              
            # re: HDU 2433 最短路
            2013-01-04 19:56 |
            ans = ans + sum_u + sum_v - sum[u] - sum[v],
            這個公式不是很理解啊,不知道博主怎么想的啊,謝謝咯  回復  更多評論
              
            # re: HDU 2433 最短路
            2013-04-28 19:38 | test
            這方法應該不對。 看下面這組數據
            4 4
            1 2
            2 3
            3 4
            2 4

            畫個圖,刪去最后一條邊 2 4 后的結果應該是20,但是此方法的輸出是19   回復  更多評論
              
            # re: HDU 2433 最短路
            2014-08-23 17:21 | YueYueZha
            @test
            的確這組數據應該輸出20的  回復  更多評論
              
            <2012年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            轉載,請標明出處!謝謝~~

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            • 1.?re: HDU 2433 最短路
            • @test
              的確這組數據應該輸出20的
            • --YueYueZha
            • 2.?re: HDU 2433 最短路
            • 這方法應該不對。 看下面這組數據
              4 4
              1 2
              2 3
              3 4
              2 4

              畫個圖,刪去最后一條邊 2 4 后的結果應該是20,但是此方法的輸出是19
            • --test
            • 3.?re: HDU 2433 最短路
            • ans = ans + sum_u + sum_v - sum[u] - sum[v],
              這個公式不是很理解啊,不知道博主怎么想的啊,謝謝咯
            • --姜
            • 4.?re: HDU 2433 最短路
            • @attacker
              the i-th line is the new SUM after the i-th road is destroyed
            • --路修遠
            • 5.?re: HDU 2433 最短路
            • 你這樣可以AC????刪除<U,V>不僅改變 u,v最短路啊、、、求解
            • --attacker

            閱讀排行榜

            評論排行榜

            久久久久久午夜精品| 99久久99久久| 中文成人久久久久影院免费观看| 国内精品久久久久久不卡影院| 狠狠精品干练久久久无码中文字幕 | 国产精品女同一区二区久久| 国产一区二区精品久久岳| 久久夜色撩人精品国产小说| 午夜不卡久久精品无码免费| 国产精品一久久香蕉国产线看观看| 99久久精品费精品国产| 久久精品桃花综合| 青青青国产成人久久111网站| 欧美粉嫩小泬久久久久久久| 精品久久久久久无码专区不卡| 久久久精品久久久久久| 91精品国产高清久久久久久io| 久久亚洲高清综合| 精品国产91久久久久久久| 亚洲精品午夜国产va久久| 久久亚洲精品中文字幕三区| 亚洲精品无码久久久久sm| 久久精品中文字幕一区| 久久99精品国产| 久久综合亚洲欧美成人| 国产精品久久久久a影院| 精品久久久久一区二区三区| 狠狠干狠狠久久| 99久久人妻无码精品系列蜜桃| 久久99久国产麻精品66| 久久99九九国产免费看小说| 久久香蕉国产线看观看猫咪?v| 99久久国产亚洲高清观看2024| 久久无码人妻一区二区三区| 中文字幕久久精品无码| 国产毛片欧美毛片久久久| 香蕉久久夜色精品国产2020| 欧美一区二区久久精品| 一个色综合久久| 久久亚洲sm情趣捆绑调教| 99久久夜色精品国产网站 |