• HDU 3790 最短路径问题(SPFA || Dijkstra )


    题目链接

    题意 : 中文题不详述。

    思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次。

     1 //3790
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <queue>
     7 const int INF = 1 << 28 ;
     8 
     9 using namespace std;
    10 
    11 int n, m,s,t;
    12 int cost[1100][1100] ,mapp[1100][1010];
    13 int dist[1100],cost1[1100] ;
    14 int vis[1100] ;
    15 
    16 void spfa(int src)
    17 {
    18     queue<int> Q ;
    19     memset(vis,0,sizeof(vis)) ;
    20     for(int i = 1 ; i <= n ; i++)
    21     {
    22         dist[i] = INF ;
    23         cost1[i] = INF ;
    24     }
    25     dist[src] = 0 ;
    26     vis[src] = 1 ;
    27     cost1[src] = 0;
    28     Q.push(src) ;
    29     while(!Q.empty())
    30     {
    31         int u = Q.front() ;
    32         Q.pop() ;
    33         vis[u] = 0;
    34         for(int i = 1 ; i <= n ; i++)
    35         {
    36 
    37             if(dist[i] > dist[u] + mapp[u][i])
    38             {
    39                 dist[i] = dist[u] + mapp[u][i] ;
    40                 cost1[i] = cost1[u] + cost[u][i] ;
    41                 if(!vis[i])
    42                 {
    43                     vis[i] = 1 ;
    44                     Q.push(i) ;
    45                 }
    46             }
    47             else if(dist[i] == dist[u]+mapp[u][i])
    48             {
    49                 if(cost1[i] > cost1[u] + cost[u][i])
    50                 {
    51                     cost1[i]=cost1[u] + cost[u][i];
    52                     if(!vis[i])
    53                     {
    54                         vis[i] = 1 ;
    55                         Q.push(i) ;
    56                     }
    57                 }
    58 
    59             }
    60         }
    61     }
    62 }
    63 void Init()
    64 {
    65     for(int i = 1 ; i <= n ; i++)
    66         for(int j = 1 ; j <= n ; j++)
    67         {
    68             if(i == j) mapp[i][j] = cost[i][j] = 0 ;
    69             else mapp[i][j] = cost[i][j] = INF ;
    70         }
    71 }
    72 int main()
    73 {
    74     //
    75     while(cin >> n >> m)
    76     {
    77         if(n == 0 && m == 0) break ;
    78         int a, b , d , p ;
    79         Init() ;
    80         for(int i = 0 ; i < m ; i++)
    81         {
    82             cin >> a >> b >> d >> p ;
    83             if(mapp[a][b] > d)
    84             {
    85                 mapp[a][b] = mapp[b][a] = d ;
    86                 cost[a][b] = cost[b][a] = p ;
    87             }
    88             else if(mapp[a][b] == d&&cost[a][b] > p)
    89                 cost[a][b] = cost[b][a] = p ;
    90         }
    91         cin >> s >> t ;
    92         spfa(s) ;
    93         printf("%d %d
    ",dist[t],cost1[t]) ;
    94     }
    95     return 0;
    96 }
    View Code

    会神的Dijkstra

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 1001
     5 using namespace std;
     6 const int inf=1<<28;
     7 
     8 int g[maxn][maxn];
     9 int cost[maxn][maxn];
    10 int n,m,a,b,d,p,s,e;
    11 bool vis[maxn];
    12 int dis[maxn],c[maxn];
    13 
    14 void inti()
    15 {
    16     for(int i=1; i<=n; i++)
    17     {
    18         for(int j=1; j<=n; j++)
    19         {
    20             if(i==j)
    21             {
    22                 g[i][j]=0;
    23                 cost[i][j]=0;
    24             }
    25             else
    26             {
    27                 g[i][j]=inf;
    28                 cost[i][j]=inf;
    29             }
    30         }
    31     }
    32 }
    33 
    34 void dijkstra(int str)
    35 {
    36     memset(vis,false,sizeof(vis));
    37     for(int i=1; i<=n; i++)
    38     {
    39         dis[i]=g[str][i];
    40         c[i]=cost[str][i];
    41     }
    42     dis[str]=0;
    43     c[str]=0; vis[str]=true;
    44     for(int i=1; i<n; i++)
    45     {
    46         int m=inf,x;
    47         for(int y=1; y<=n; y++)  if(!vis[y]&&dis[y]<m) m=dis[x=y];
    48         vis[x]=true;
    49         for(int y=1; y<=n; y++)
    50         {
    51             if(!vis[y]&&g[x][y]!=inf)
    52             {
    53                 if(dis[y]>dis[x]+g[x][y])
    54                 {
    55                     dis[y]=dis[x]+g[x][y];
    56                     c[y]=c[x]+cost[x][y];
    57                 }
    58                 else if(dis[y]==dis[x]+g[x][y])
    59                 {
    60                     if(c[y]>c[x]+cost[x][y])
    61                         c[y]=c[x]+cost[x][y];
    62                 }
    63             }
    64         }
    65     }
    66 }
    67 int main()
    68 {
    69     while(scanf("%d%d",&n,&m)!=EOF)
    70     {
    71         if(n==0&&m==0) break;
    72         inti();
    73         for(int i=0; i<m; i++)
    74         {
    75             scanf("%d%d%d%d",&a,&b,&d,&p);
    76             if(d<g[a][b])
    77             {
    78                 g[a][b]=g[b][a]=d;
    79                 cost[a][b]=cost[b][a]=p;
    80             }
    81 
    82         }
    83         scanf("%d%d",&s,&e);
    84         dijkstra(s);
    85         printf("%d %d
    ",dis[e],c[e]);
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    实用硬件篇(一)
    iOS通讯录(纯纯的干货)
    iOS社会化分享(干货)
    静态库的打包及使用(干货)
    iOS地图集成示例:百度地图POI检索
    iOS开发之KVC全解
    网络干货
    输入一个字符串,按字典序打印出该字符串中字符的所有排列(剑指offer)
    序列化二叉树
    二叉树中和为某一值的路径
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3874765.html
Copyright © 2020-2023  润新知