• Hdu


    上题目:

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 21107    Accepted Submission(s): 8998


    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

     
    Input
    输 入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店 所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B& lt;=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
     
    Sample Output
    3 2
     
     
      这一题难度其实不大,要注意dij只可以用在DAG上面,这一题有环,不可以用dij,当然,我看到别人好像用dij过了,目测是我的dij有什么问题= =。
      这里我用了flyod,当然还有其他更好地办法,毕竟flyod复杂度在O(n^3)。不过flyod写起来比较简单= =。
      最近精神有点xx,写个dij也写错了2次= =,结果交上去了还是wa,最后才换成flyod就过了,可是时间好像慢了点,用了45MS。= =。看来还要继续努力啊。
     
    上代码:
     
     1 int s[MAX][MAX],dis[MAX];
     2 
     3 
     4 void dij(int n)
     5 {
     6     int i,j,flag,minn;
     7     bool fin[MAX];
     8     for(i=2;i<=n;i++) dis[i]=s[1][i] ? s[1][i] : INF;
     9     memset(fin,0,sizeof(fin));
    10     fin[1]=1;
    11     i=1;
    12     for(j=2;j<=n;j++)
    13     {
    14         minn=INF;
    15         for(i=1;i<=n;i++) if(!fin[i] && dis[i]<minn) {minn=dis[i];flag=i;}
    16         fin[flag]=1;
    17         for(j=1;j<=n;j++)
    18         {
    19             if(!fin[j] && s[flag][j] && (minn+s[flag][j]<dis[j]))
    20             dis[j]=minn+s[flag][j];
    21         }
    22     }
    23 }
    dij
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAX 100+10
     4 #define INF 1000000000
     5 using namespace std;
     6 
     7 int s[MAX][MAX],d[MAX][MAX];
     8 
     9 
    10 void flyod(int n)
    11 {
    12     int i,j,u;
    13     memcpy(d,s,sizeof(s));
    14     for(i=1;i<=n;i++)
    15        for(j=1;j<=n;j++)
    16           if(!d[i][j]) d[i][j] = i==j ? 0 : INF;
    17 
    18     for(u=1;u<=n;u++)
    19     {
    20         for(i=1;i<=n;i++)
    21         {
    22             for(j=1;j<=n;j++)
    23             {
    24                 d[i][j] = (d[i][j] > d[i][u]+d[u][j]) ? (d[i][u]+d[u][j]) : d[i][j];
    25             }
    26         }
    27     }
    28 }
    29 
    30 int main()
    31 {
    32     int n,m,i,x,y,di,e;
    33     while(scanf("%d %d",&n,&m),(n && m))
    34     {
    35         memset(s,0,sizeof(s));
    36         for(i=1;i<=m;i++)
    37         {
    38             scanf("%d %d %d",&x,&y,&di);
    39             s[x][y]=di;
    40             s[y][x]=di;
    41         }
    42         flyod(n);
    43         e=d[1][n];
    44         printf("%d
    ",e);
    45     }
    46     return 0;
    47 }
    flyod

     补充一个用spfa过的代码

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #define MAX 100000+10
     5 #define INF 1000000000
     6 using namespace std;
     7 
     8 typedef struct
     9 {
    10     int v;
    11     int l;
    12     int next;
    13 }path;
    14 
    15 path p[MAX];
    16 int head[MAX],dis[MAX],c[MAX],n,m,tot;
    17 bool vin[MAX];
    18 queue<int> q;
    19 
    20 void add(int u,int v,int l)
    21 {
    22     p[tot].v=v;
    23     p[tot].l=l;
    24     p[tot].next=head[u];
    25     head[u]=tot++;
    26 }
    27 
    28 bool spfa(int s)
    29 {
    30     int i,u,v;
    31     for(i=1;i<=n;i++) {dis[i]=INF;}
    32     dis[s]=0;
    33     while(!q.empty()) q.pop();
    34     memset(vin,0,sizeof(vin));
    35     memset(c,0,sizeof(c));
    36     q.push(s);
    37     vin[s]=1;
    38     c[s]++;
    39     while(!q.empty())
    40     {
    41         u=q.front();
    42         q.pop();
    43         vin[u]=0;
    44         for(v=head[u];v!=-1;v=p[v].next)
    45         {
    46             if(dis[p[v].v] > dis[u]+p[v].l)
    47             {
    48                 dis[p[v].v]=dis[u]+p[v].l;
    49                 if(!vin[p[v].v])
    50                 {
    51                     q.push(p[v].v);
    52                     c[v]++;
    53                     vin[p[v].v]=1;
    54                     if(c[p[v].v]>n) return 0;
    55                 }
    56             }
    57         }
    58     }
    59     return 1;
    60 }
    61 
    62 int main()
    63 {
    64     int i,u,v,l;
    65     //freopen("data.txt","r",stdin);
    66     while(scanf("%d %d",&n,&m),(n && m))
    67     {
    68         memset(p,0,sizeof(p));
    69         memset(head,-1,sizeof(head));
    70         tot=0;
    71         for(i=0;i<m;i++)
    72         {
    73             scanf("%d %d %d",&u,&v,&l);
    74             add(u,v,l);
    75             add(v,u,l);
    76         }
    77         spfa(1);
    78         printf("%d
    ",dis[n]);
    79     }
    80     return 0;
    81 }
    spfa
  • 相关阅读:
    [Web]flask-excel实现excel文件下载的前后端实现
    [python]UnicodeEncodeError: 'gbk' codec can't encode character 'ufffd'
    [vscode] pylint在虚拟环境下错误告警问题
    [转]jQuery 选择器和dom操作
    用户认证过程及用户认证相关问题整理
    [mariadb]Windows Mariadb 10.2安装过程
    [Python]Flask 源代码分析-config
    【Weiss】【第03章】练习3.9:大整数运算包
    【Weiss】【第03章】练习3.8:有序多项式求幂
    【Weiss】【第03章】链表例程的一些修改
  • 原文地址:https://www.cnblogs.com/sineatos/p/3191148.html
Copyright © 2020-2023  润新知