zoukankan      html  css  js  c++  java
  • 没地方存代码系列————一堆最短路

    http://59.77.139.92/Problem.jsp?pid=1499

    FJUTOJ 1499 直接建图求s到T的最短路就可以了。

    Floyd

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const int maxn = 205;
     5 
     6 int n,m,mp[maxn][maxn];
     7 /**
     8 
     9 dp[k][i][j]  1~k i->j的最短路
    10 dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j])
    11 
    12     i->k->j
    13     i->j 与 i->k,k->j 的最短路
    14     只与k,k-1省略一维度空间后
    15     dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
    16 */
    17 int main()
    18 {
    19     while(~scanf("%d%d",&n,&m))
    20     {
    21         for(int i=0; i<n; i++)
    22             for(int j=0; j<n; j++)
    23                 if(i==j)mp[i][j]=0;
    24                 else mp[i][j]=1e9;
    25         for(int i=0; i<m; i++)
    26         {
    27             int x,y,z;
    28             scanf("%d%d%d",&x,&y,&z);
    29             mp[x][y]=min(z,mp[x][y]);
    30             mp[y][x]=min(z,mp[y][x]);
    31         }
    32         int s,t;
    33         scanf("%d%d",&s,&t);
    34         for(int k=0; k<n; k++)
    35             for(int i=0; i<n; i++)
    36                 for(int j=0; j<n; j++)
    37                     mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
    38 
    39         if(mp[s][t]==1e9)puts("-1");
    40         else printf("%d
    ",mp[s][t]);
    41 
    42     }
    43     return 0;
    44 }
    View Code

     SPFA+邻接表

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const int maxn = 205;
     5 vector<pair<int,int> >E[maxn];
     6 
     7 int n,m;
     8 int d[maxn],inq[maxn];
     9 void init()
    10 {
    11     for(int i=0; i<maxn; i++)E[i].clear();
    12     for(int i=0; i<maxn; i++)inq[i]=0;
    13     for(int i=0; i<maxn; i++)d[i]=1e9;
    14 }
    15 
    16 int main()
    17 {
    18     while(cin>>n>>m)
    19     {
    20         init();
    21         for(int i=0; i<m; i++)
    22         {
    23             int x,y,z;
    24             scanf("%d%d%d",&x,&y,&z);
    25             E[x].push_back(make_pair(y,z));///x->y 距离z
    26             E[y].push_back(make_pair(x,z));
    27         }
    28         int s,t;
    29         scanf("%d%d",&s,&t);//从s->t
    30 
    31         queue<int>Q;
    32         Q.push(s),d[s]=0,inq[s]=1;
    33         while(!Q.empty())
    34         {
    35             int now=Q.front();
    36             Q.pop();
    37             inq[now]=0;
    38             for(int i=0; i<E[now].size(); i++)
    39             {
    40                 int v=E[now][i].first;
    41                 if(d[v]>d[now]+E[now][i].second)
    42                 {
    43                     d[v]=d[now]+E[now][i].second;//松弛操作
    44                     if(inq[v]==1)continue;
    45                     inq[v]=1;
    46                     Q.push(v);
    47                 }
    48             }
    49         }
    50         if(d[t]==1e9)printf("-1
    ");
    51         else printf("%d
    ",d[t]);
    52     }
    53     return 0;
    54 }
    View Code

    SPFA+链式前向星,忘记初始化了,改半天,醉了╮(╯▽╰)╭

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 
     7 #define  INF  1<<29
     8 
     9 using namespace std;
    10 const int maxn = 10010;
    11 
    12 int n,m;
    13 struct edge
    14 {
    15     int to,w,next;
    16 }edge[maxn*2];
    17 int first[maxn],sign;
    18 
    19 void init()
    20 {
    21     memset(first,0,sizeof(first));
    22     sign=1;
    23 }
    24 
    25 void add_edge(int u,int v,int w)
    26 {
    27     edge[sign].to=v;
    28     edge[sign].w=w;
    29     edge[sign].next=first[u];
    30     first[u]=sign++;
    31 }
    32 
    33 void spfa(int s,int t)
    34 {
    35     queue<int>q;
    36     int inq[maxn]={0},dis[maxn],now;
    37     for(int i=1;i<=n;i++)
    38     {
    39         dis[i]=INF;
    40     }
    41     q.push(s);
    42     inq[s]=1,dis[s]=0;
    43     while(!q.empty())
    44     {
    45         now=q.front();
    46         q.pop();
    47         inq[now]=0;
    48         for(int i=first[now];i;i=edge[i].next)
    49         {
    50             int to=edge[i].to;
    51             if(dis[to]>dis[now]+edge[i].w)
    52             {
    53                 dis[to]=dis[now]+edge[i].w;
    54                 if(!inq[to])
    55                 {
    56                     inq[to]=1;
    57                     q.push(to);
    58                 }
    59             }
    60         }
    61     }
    62 
    63     if(dis[t]==INF)puts("-1");
    64     else printf("%d
    ",dis[t]);
    65 }
    66 
    67 int main()
    68 {
    69     int x,y,z,s,t;
    70     while(~scanf("%d%d",&n,&m))
    71     {
    72         init();
    73         for(int i=0;i<m;i++)
    74         {
    75             scanf("%d%d%d",&x,&y,&z);
    76             add_edge(x,y,z);
    77             add_edge(y,x,z);
    78         }
    79         scanf("%d%d",&s,&t);
    80         spfa(s,t);
    81     }
    82     return 0;
    83 }
    View Code

    FJUTOJ 1501 http://59.77.139.92/Problem.jsp?pid=1501

    SPFA+邻接矩阵

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <queue>
     6 #define  INF 1<<29
     7 #define  MAXN 1005
     8 
     9 using namespace std;
    10 int n,m,s,mp[MAXN][MAXN];
    11 
    12 int spfa(int s,int t)
    13 {
    14     int dis[MAXN],inq[MAXN];
    15     for(int i=0;i<=n;i++)
    16     {
    17         dis[i]=INF,inq[i]=0;
    18     }
    19     queue<int>q;
    20     q.push(0);
    21     dis[0]=0,inq[0]=1;
    22     while(!q.empty())
    23     {
    24         int now=q.front();
    25         q.pop();
    26         inq[now]=0;
    27         for(int i=0;i<=n;i++)
    28         {
    29             if(dis[i]>dis[now]+mp[now][i])
    30             {
    31                 dis[i]=dis[now]+mp[now][i];
    32                 if(!inq[i])
    33                 {
    34                     inq[i]=1;
    35                     q.push(i);
    36                 }
    37             }
    38         }
    39     }
    40     if(dis[t]==INF) return -1;
    41     return dis[t];
    42 }
    43 
    44 int main()
    45 {
    46     int u,v,w,num,tmp;
    47     while(~scanf("%d%d%d",&n,&m,&s))
    48     {
    49         for(int i=0;i<=n;i++)
    50         {
    51             for(int j=0;j<=n;j++)
    52             {
    53                 if(i==j)mp[i][j]=0;
    54                 else mp[i][j]=INF;
    55             }
    56         }
    57         for(int i=0;i<m;i++)
    58         {
    59             scanf("%d%d%d",&u,&v,&w);
    60             mp[u][v]=min(mp[u][v],w);
    61         }
    62         scanf("%d",&num);
    63         while(num--)
    64         {
    65             scanf("%d",&tmp);
    66             mp[0][tmp]=0;
    67         }
    68         printf("%d
    ",spfa(0,s));
    69     }
    70     return 0;
    71 }
    View Code

      

    FJUT OJ 1443 http://59.77.139.92/Problem.jsp?pid=1443

    直接建图,求1-n的最短路,dijkstra一堆for的版本

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #define  INF 1<<29
     6 
     7 using namespace std;
     8 int mp[1005][1005],i,j,t,n,a,b,c;
     9 
    10 void dijkstra()
    11 {
    12     int minn,v,dis[1005],vis[1005]={0};
    13     for(i=1;i<=n;i++)
    14         dis[i]=mp[1][i];
    15 
    16     for(i=1;i<=n;i++)
    17     {
    18         minn=INF;
    19         for(j=1;j<=n;j++)
    20         {
    21             if(!vis[j]&&dis[j]<minn)
    22             {
    23                 v=j;
    24                 minn=dis[j];
    25             }
    26         }
    27         vis[v]=1;
    28 
    29         for(j=1;j<=n;j++)
    30         {
    31             if(!vis[j]&&dis[j]>mp[v][j]+dis[v])
    32             {
    33                 dis[j]=mp[v][j]+dis[v];
    34             }
    35         }
    36     }
    37     printf("%d
    ",dis[n]);
    38 }
    39 
    40 int main()
    41 {
    42     while(~scanf("%d%d",&t,&n))
    43     {
    44         for(i=1;i<=n;i++)
    45         {
    46             for(j=1;j<=n;j++)
    47             {
    48                 if(i==j)
    49                 {
    50                     mp[i][j]=0;
    51                 }
    52                 else
    53                 {
    54                     mp[i][j]=mp[j][i]=INF;
    55                 }
    56             }
    57         }
    58         for(i=0;i<t;i++)
    59         {
    60             scanf("%d%d%d",&a,&b,&c);
    61             if(mp[a][b]>c)mp[a][b]=mp[b][a]=c;
    62         }
    63         dijkstra();
    64     }
    65 
    66     return 0;
    67 }
    View Code

    FJUTOJ 1456 http://59.77.139.92/Problem.jsp?pid=1456

    转向次数可以看作路径长度,建图求最短路,这里用的是链式前向星+dijkstra

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #define  INF 0x3fffffff
     6 
     7 using namespace std;
     8 const int maxn =10010;
     9 
    10 int first[maxn],sign;
    11 
    12 struct node
    13 {
    14     int to,w,next;
    15 }edge[maxn*2];
    16 
    17 void creat()
    18 {
    19     for(int i=0;i<maxn;i++)
    20         first[i]=0;
    21     sign=1;
    22 }
    23 
    24 void add_edge(int u,int v,int w)///u->v cost w
    25 {
    26     edge[sign].w=w;
    27     edge[sign].to=v;
    28     edge[sign].next=first[u];
    29     first[u]=sign++;
    30 }
    31 
    32 int dij(int n,int a,int b)
    33 {
    34     int dis[n+5],vis[n+5];
    35     int nn=n-1;
    36     for(int i=0;i<=n;i++)
    37     {
    38         dis[i]=INF,vis[i]=0;
    39     }
    40     dis[a]=0;
    41     int p=a;
    42     while(nn--)
    43     {
    44         vis[p]=1;
    45         for(int k=first[p];k;k=edge[k].next)
    46         {
    47             int to=edge[k].to;
    48             if(!vis[to]&&dis[to]>dis[p]+edge[k].w)
    49             {
    50                 dis[to]=dis[p]+edge[k].w;
    51             }
    52         }
    53         int mincost=INF;
    54         for(int i=1;i<=n;i++)
    55         {
    56             if(!vis[i]&&dis[i]<mincost)
    57             {
    58                 mincost=dis[i];
    59                 p=i;
    60             }
    61         }
    62         if(mincost==INF)return -1;
    63     }
    64     return dis[b];
    65 }
    66 
    67 int main()
    68 {
    69     int n,a,b,num,tmp;
    70     while(~scanf("%d%d%d",&n,&a,&b))
    71     {
    72         creat();
    73         for(int i=1;i<=n;i++)
    74         {
    75             scanf("%d%d",&num,&tmp);
    76             add_edge(i,tmp,0);
    77             for(int j=1;j<num;j++)
    78             {
    79                 scanf("%d",&tmp);
    80                 add_edge(i,tmp,1);
    81             }
    82         }
    83         int ans=dij(n,a,b);
    84         printf("%d
    ",ans);
    85     }
    86     return 0;
    87 }
    View Code

      

  • 相关阅读:
    关于python Tk中实时的输出.
    tkinter调取签名网而设计签名页面(十七)
    多进程Multiprocessing模块
    tkinter做一个简单的登陆页面(十六)
    maven常用命令
    通用接口测试用例
    关于log4j
    场景测试-支付场景
    自动化测试的意义
    自动化测试之明确目的
  • 原文地址:https://www.cnblogs.com/Q1143316492/p/6662118.html
Copyright © 2011-2022 走看看