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

    IDOriginTitle
    Problem A HDU 2544 最短路
    Problem B HDU 3790 最短路径问题
    Problem C HDU 3665 Seaside
    Problem D HDU 1869 六度分离
    Problem E HDU 1874 畅通工程续
    Problem F HDU 1317 XYZZY
    Problem G HDU 4360 As long as Binbin loves Sangsang
    Problem H POJ 1847 Tram
    Problem I POJ 1062 昂贵的聘礼

    题目就挂在这里了,还有F,G,H没有搞出、有一个大的教训就是以后不管有没有重边,一律都考虑。

    A题,最水的dijkstra

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 
     6 int Map[105][105],N,M,d[105],vis[105];
     7 
     8 int dijkstra(int s)
     9 {
    10     mem(vis);
    11     for(int i=0;i<=N;i++) d[i] = INF;
    12     d[s] = 0;
    13     for(int i=1;i<=N;i++)
    14     {
    15         int m = INF;
    16         for(int j = 1;j<=N;j++)if(!vis[j] && d[j]<m)m=d[s=j];
    17         vis[s] = 1;
    18         for(int j=1;j<=N;j++)if(d[j] > d[s]+Map[s][j])d[j]=d[s]+Map[s][j];
    19     }
    20     return d[N];
    21 }
    22 
    23 int main()
    24 {
    25     while(~scanf("%d%d", &N,&M) && (N||M))
    26     {
    27         for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)
    28         {
    29             Map[i][j] = INF;
    30         }
    31         for(int i=1;i<=M;i++)
    32         {
    33             int a,b,c;
    34             scanf("%d%d%d", &a,&b,&c);
    35             Map[a][b] = Map[b][a] = c;
    36         }
    37         printf("%d
    ", dijkstra(1));
    38     }
    39     return 0;
    40 }
    View Code

    B题,之前不会捉,想了一会,后来就直接模仿dijkstra的一组D值,搞了两组(坑爹的copy代码,数组大小没改WA了4次)。

    当路径较短时,就直接选择较短的;

    当路径相同时,选择花费较小的。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 #define MIN(a,b) ((a) < (b) ? (a) : (b))
     6 
     7 int N,M,d[1005][1005],p[1005][1005],vis[1005],D[1005],P[1005];
     8 int S,E;
     9 
    10 void dijkstra()
    11 {
    12     mem(vis);
    13     for(int i=1;i<=N;i++)D[i] = P[i] = INF;
    14     D[S] = P[S] = 0;
    15     for(int i=1;i<=N;i++)
    16     {
    17         int key1 = INF,key2 = INF;
    18         for(int j=1;j<=N;j++)if(!vis[j])
    19         {
    20             if(D[j] < key1){key1=D[S=j];key2=P[j];}
    21             else if(D[j]==key1 && P[j]<key2){S=j;key2=P[j];}
    22         }
    23         vis[S] = 1;
    24         for(int j=1;j<=N;j++)
    25         {
    26             if(D[j] > D[S] + d[S][j])
    27             {
    28                 D[j] = D[S] + d[S][j];
    29                 P[j] = P[S] + p[S][j];
    30             }
    31             else if(D[j] == D[S] + d[S][j] && P[j] > P[S] + p[S][j])
    32             {
    33                 P[j] = P[S] + p[S][j];
    34             }
    35         }
    36     }
    37 }
    38 
    39 int main()
    40 {
    41     while(~scanf("%d%d", &N, &M) && (M || N))
    42     {
    43         for(int i=0;i<=N;i++)
    44         {
    45             for(int j=0;j<=N;j++)
    46             {
    47                 d[i][j] = p[i][j] = INF;
    48             }
    49         }
    50         int a,b,dist,price;
    51         for(int i=0;i<M;i++)
    52         {
    53             scanf("%d%d%d%d", &a,&b,&dist,&price);
    54             if(d[a][b] > dist)
    55             {
    56                 d[a][b] = d[b][a] = dist;
    57                 p[a][b] = p[b][a] = price;
    58             }
    59             else if(d[a][b] == dist && p[a][b] > price)
    60             {
    61                 d[a][b] = d[b][a] = dist;
    62                 p[a][b] = p[b][a] = price;
    63             }
    64         }
    65         scanf("%d%d", &S,&E);
    66         dijkstra();
    67         printf("%d %d
    ", D[E],P[E]);
    68     }
    69     return 0;
    70 }
    View Code

    C题,从没做过数据这么水的题,尼玛N<=10!!!想怎么搞就怎么搞。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 
     6 int Map[20][20],N,d[20],vis[20],End[20];
     7 
     8 void dijkstra(int s)
     9 {
    10     for(int i=0;i<=N;i++) d[i] = INF;
    11     d[s] = 0;
    12     for(int i=0;i<N;i++)
    13     {
    14         int m = INF;
    15         for(int j = 0;j<N;j++)if(!vis[j] && d[j]<m)m=d[s=j];
    16         vis[s] = 1;
    17         for(int j=0;j<N;j++)if(d[j] > d[s]+Map[s][j])d[j]=d[s]+Map[s][j];
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     while(~scanf("%d", &N))
    24     {
    25         mem(End); mem(vis);
    26         for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)
    27         {
    28             Map[i][j] = INF;
    29         }
    30         int M,e,p;
    31         for(int i=0;i<N;i++)
    32         {
    33             scanf("%d%d", &M, &End[i]);
    34             for(int j=0;j<M;j++)
    35             {
    36                 scanf("%d%d", &e,&p);
    37                 if(Map[i][e] > p) Map[i][e] = Map[e][i] = p;
    38             }
    39         }
    40         dijkstra(0);
    41         int ans = INF;
    42         for(int i=0;i<N;i++)if(End[i])
    43         {
    44             if(ans > d[i]) ans = d[i];
    45         }
    46         printf("%d
    ", ans);
    47     }
    48     return 0;
    49 }
    View Code

    D题,简单的floyd

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 
     6 int N,M,d[105][105];
     7 
     8 void flyod()
     9 {
    10     for(int k=0;k<N;k++)
    11     {
    12         for(int i=0;i<N;i++)
    13         {
    14             for(int j=0;j<N;j++)
    15             {
    16 
    17                 if(d[i][j] > d[i][k] + d[k][j])
    18                 {
    19                     d[i][j] = d[i][k] + d[k][j];
    20                 }
    21             }
    22         }
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     while(~scanf("%d%d", &N,&M))
    29     {
    30         for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)
    31         {
    32             d[i][j] = INF;
    33         }
    34         int A,B;
    35         for(int i=0;i<M;i++)
    36         {
    37             scanf("%d%d", &A,&B);
    38             d[A][B] = d[B][A] = 1;
    39         }
    40         flyod();
    41         int ans = 1;
    42         for(int i=0;i<N && ans;i++)
    43         {
    44             for(int j=i+1;j<N && ans;j++)
    45             {
    46                 if(d[i][j] > 7)ans = 0;
    47             }
    48         }
    49         printf("%s
    ",ans? "Yes":"No");
    50     }
    51     return 0;
    52 }
    View Code

    E题,floyd可以过,dijkstra也可以

    flyod

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<map>
     5 #include<vector>
     6 #include<set>
     7 #include<stack>
     8 #include<queue>
     9 #include<algorithm>
    10 #include<stdlib.h>
    11 using namespace std;
    12 #define MAX(a,b) (a > b ? a : b)
    13 #define MIN(a,b) (a < b ? a : b)
    14 #define MAXN  10000001
    15 #define INF 1000000007
    16 #define mem(a) memset(a,0,sizeof(a))
    17 
    18 int w[200][200];
    19 int n;
    20 
    21 void floyd()
    22 {
    23     for(int k=0;k<n;k++)
    24     {
    25         for(int i=0;i<n;i++)
    26         {
    27             for(int j=0;j<n;j++)
    28             {
    29                 w[i][j] = MIN(w[i][j], w[i][k]+w[k][j]);
    30             }
    31         }
    32     }
    33 }
    34 
    35 int main()
    36 {
    37     //freopen("in.txt","r",stdin);
    38     //freopen("out.txt","w",stdout);
    39     int m;
    40     while(~scanf("%d%d",&n,&m))
    41     {
    42         for(int i=0;i<n;i++)
    43         {
    44             for(int j=0;j<n;j++)
    45             {
    46                 w[i][j]=INF;
    47             }
    48         }
    49 
    50         int a,b,x;
    51         for(int i=0;i<m;i++)
    52         {
    53             scanf("%d%d%d",&a,&b,&x);
    54             if(w[a][b]>x)w[a][b] = w[b][a] = x;
    55         }
    56         int s,t;
    57         scanf("%d%d",&s,&t);
    58         if(s==t){printf("0
    ");continue;}
    59 
    60         floyd();
    61 
    62         printf("%d
    ",w[s][t]==INF?-1:w[s][t]);
    63     }
    64     return 0;
    65 }
    View Code

    dijkstra

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 
     6 int Map[205][205],N,M,d[205],vis[205],S,E;
     7 
     8 int dijkstra(int s)
     9 {
    10     mem(vis);
    11     for(int i=0;i<=N;i++) d[i] = INF;
    12     d[s] = 0;
    13     for(int i=0;i<N;i++)
    14     {
    15         int m = INF;
    16         for(int j = 1;j<=N;j++)if(!vis[j] && d[j]<m)m=d[s=j];
    17         vis[s] = 1;
    18         for(int j=1;j<=N;j++)if(d[j] > d[s]+Map[s][j])d[j]=d[s]+Map[s][j];
    19     }
    20     return d[E+1];
    21 }
    22 
    23 int main()
    24 {
    25     while(~scanf("%d%d", &N,&M))
    26     {
    27         for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)
    28         {
    29             Map[i][j] = INF;
    30         }
    31         for(int i=1;i<=M;i++)
    32         {
    33             int a,b,c;
    34             scanf("%d%d%d", &a,&b,&c);
    35             if(Map[a+1][b+1] > c)Map[a+1][b+1] = Map[b+1][a+1] = c;
    36         }
    37         scanf("%d%d", &S,&E);
    38         int ans = dijkstra(S+1);
    39         printf("%d
    ", ans == INF ? -1 : ans);
    40     }
    41     return 0;
    42 }
    View Code

    I题,见之前写的博客

    http://www.cnblogs.com/gj-Acit/p/3222969.html

    下面是比赛时候的代码

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define mem(a) memset(a,0,sizeof(a))
     4 #define INF 100000007
     5 #define MIN(a,b) ((a) < (b) ? (a) : (b))
     6 
     7 int N,M,d[105],price[105][105],level[105],vis[105],X;
     8 
     9 
    10 int dijkstra()//返回0到1的最短路
    11 {
    12     for(int i=1;i<=N;i++) d[i] = price[i][i];
    13     for(int i=1;i<=N;i++)
    14     {
    15         int m = INF,s;
    16         for(int j=1;j<=N;j++)if(!vis[j] && d[j]<m) m=d[s=j];
    17         vis[s]=1;
    18         for(int j=1;j<=N;j++)if(!vis[j] && d[j]>d[s]+price[s][j])d[j]=d[s]+price[s][j];
    19     }
    20     return d[1];
    21 }
    22 
    23 int main()
    24 {
    25     while(~scanf("%d%d", &M, &N))
    26     {
    27         for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)
    28         {
    29             price[i][j] = INF;
    30         }
    31         int A,P;
    32         for(int i=1;i<=N;i++)
    33         {
    34             scanf("%d%d%d", &price[i][i],&level[i],&X);
    35             for(int j=0;j<X;j++)
    36             {
    37                 scanf("%d%d", &A, &P);
    38                 price[A][i] = P;
    39             }
    40         }
    41         int ans = INF;
    42         for(int i=1;i<=N;i++)
    43         {
    44             for(int j=1;j<=N;j++)
    45             {
    46                 if(level[j]>level[i] || level[i]-level[j]>M) vis[j] = 1;
    47                 else vis[j] = 0;
    48             }
    49             int flag = dijkstra();
    50             ans = MIN(ans, flag);
    51         }
    52         printf("%d
    ", ans);
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    智能实验室-杀马(Defendio) 4.12.0.800
    智能实验室-结构化存储浏览器(SSExplorer) 1.7.0.170
    智能实验室-全能优化(Guardio) 4.94.0.830
    智能实验室-全能优化(Guardio) 4.9.0.790
    IT餐馆—第二十二回 控件
    当DiscuzNT遇上了Loadrunner(中)
    在Discuz!NT中进行缓存分层(本地缓存+memcached)
    介绍三个Silverlight 在线编辑器控件
    玩玩负载均衡在window与linux下配置nginx
    IT餐馆—第十八回 祭奠
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/3254347.html
Copyright © 2011-2022 走看看