zoukankan      html  css  js  c++  java
  • 最短路径

    http://acm.hdu.edu.cn/showproblem.php?pid=2544

    稍微补充了下 求任意两点间的最短距离

    Dijkstra

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define INF 0x3f3f3f3f
     4 int d[101],w[101][101],f[101];
     5 int Dijkstra(int st,int en,int n)
     6 {
     7     int i,j,min,k;
     8     d[st] = 0;
     9     memset(f,0,sizeof(f));
    10     for(i = 1 ;i <= n ; i++)
    11         if(i!=st)
    12             d[i] = INF;
    13     for(i = 1 ;i <= n ; i++)
    14     {
    15         min = INF;
    16         for(j = 1 ;j <= n ;j++)
    17             if(!f[j]&&min>=d[j])
    18                 min = d[k=j];
    19         f[k] = 1;
    20         for(j = 1; j <= n ; j++)
    21             if(d[j]>d[k]+w[k][j])
    22                 d[j] = d[k]+w[k][j];
    23     }
    24     
    25     return d[en];
    26 }
    27 int main()
    28 {
    29     int i,j, n, m,x,y,z;
    30     while(scanf("%d%d", &n,&m)&&n&&m)
    31     {
    32         memset(w,INF,sizeof(w));
    33         for(i = 1 ;i<= m ;i++)
    34         {
    35             scanf("%d%d%d", &x,&y,&z);
    36             if(w[x][y]>z)
    37             {
    38                 w[x][y] = z;
    39                 w[y][x] = z;
    40             }
    41         }
    42         printf("%d\n",Dijkstra(1,n,n));
    43 
    44     }
    45     return 0;
    46 }

    Floyd

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define INF 0x3f3f3f3f
     4 int w[101][101];
     5 int Floyd(int st,int en,int n)
     6 {
     7     int i, j, k;
     8     for(i = 1 ; i <= n ; i++)
     9         w[i][i] = 0;
    10     for(i = 1 ;i <= n ; i++)
    11         for(j = 1 ; j <= n ; j++)
    12             for(k = 1 ; k <= n ; k++)
    13                 if(w[j][k]>w[j][i]+w[i][k])
    14                     w[j][k] = w[j][i]+w[i][k];
    15     return w[st][en];
    16 }
    17 int main()
    18 {
    19     int i,j, n, m,x,y,z;
    20     while(scanf("%d%d", &n,&m)&&n&&m)
    21     {
    22         memset(w,INF,sizeof(w));
    23         for(i = 1 ;i<= m ;i++)
    24         {
    25             scanf("%d%d%d", &x,&y,&z);
    26             if(w[x][y]>z)
    27             {
    28                 w[x][y] = z;
    29                 w[y][x] = z;
    30             }
    31         }
    32         printf("%d\n",Floyd(1,n,n));
    33     }
    34     return 0;
    35 }

     Bellman-Ford算法

    http://www.wutianqi.com/?p=1912

    每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成。Bellman-ford算法有一个小优化:每次松弛先设一个旗帜flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出。

    http://poj.org/problem?id=3259

    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<string.h>
     4 #include<queue>
     5 #define INF 0x3f3f3f
     6 using namespace std;
     7 struct node
     8 {
     9     int u,v,t;
    10 }q[5000];
    11 int dis[501];
    12 int bellford(int n,int m)
    13 {
    14     int i,j;
    15     memset(dis,0,sizeof(0));
    16     for(i = 1; i <= n ; i++)
    17     {
    18         int flag = 0;
    19         for(j = 1 ; j <= m ; j++)
    20         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
    21         {
    22             dis[q[j].v] = dis[q[j].u]+q[j].t;
    23             flag = 1;
    24         }
    25         if(!flag)
    26         break;
    27     }
    28     for(j = 1; j <= m ; j++)
    29     {
    30         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
    31             return 1;
    32     }
    33     return 0;
    34 }
    35 int main()
    36 {
    37     int i,j,k,n,m,t,w1,o,a,b,c;
    38     scanf("%d",&t);
    39     while(t--)
    40     {
    41         scanf("%d%d%d",&n,&m,&w1);
    42         o = 0;
    43         for(i = 1 ; i <= m ; i++)
    44         {
    45             scanf("%d%d%d",&a,&b,&c);
    46             o++;
    47             q[o].u = a;
    48             q[o].v = b;
    49             q[o].t = c;
    50             o++;
    51             q[o].u = b;
    52             q[o].v = a;
    53             q[o].t = c;
    54         }
    55         for(i = 1 ; i <= w1 ; i++)
    56         {
    57             scanf("%d%d%d",&a,&b,&c);
    58             o++;
    59             q[o].u = a;
    60             q[o].v = b;
    61             q[o].t = -c;
    62         }
    63        if(bellford(n,o))
    64        printf("YES\n");
    65        else
    66        printf("NO\n");
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    iOS resign code with App Store profile and post to AppStore
    HTTPS科普扫盲帖 对称加密 非对称加密
    appid 评价
    使用Carthage安装第三方Swift库
    AngularJS:何时应该使用Directive、Controller、Service?
    xcode7 The operation couldn't be completed.
    cocoapods pod install 安装报错 is not used in any concrete target
    xcode7 NSAppTransportSecurity
    learning uboot how to set ddr parameter in qca4531 cpu
    learning uboot enable protect console
  • 原文地址:https://www.cnblogs.com/shangyu/p/2598065.html
Copyright © 2011-2022 走看看