畅通工程续————杭电OJ

题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1874
思路
      n,m的范围不大直接用邻接矩阵存就行,可以训练各种最短路的做法(但可能我太菜了,我用堆优化的dijkstra直接TLE了,不知道为什么QAQ)。
Floyd代码

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>

using namespace std;

const int INF=0x3f3f3f3f;
const int N=210;

int n,m;
int d[N][N];
void floyd()
{
    
    
    for(int k=0;k<n;k++)
    {
    
    
        for(int i=0;i<n;i++)
        {
    
    
            for(int j=0;j<n;j++)
            {
    
    
                if(d[i][j]>d[i][k]+d[k][j])
                {
    
    
                    d[i][j]=d[i][k]+d[k][j];
                }
            }
        }
    }
}
int main()
{
    
    
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    
    
        for(int i=0;i<n;i++)
        {
    
    
            for(int j=0;j<n;j++)
            {
    
    
                if(i==j) d[i][j]=0;
                else
                {
    
    
                    d[i][j]=INF;
                }
                
            }
        }
        for(int i=0;i<m;i++)
        {
    
    
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            getchar();
            if(d[a][b]>c)
            {
    
    
                d[a][b]=d[b][a]=c;
            }
        }
        int s,t;
        scanf("%d%d",&s,&t);
        getchar();
        floyd();
        if(d[s][t]==INF)
        {
    
    
            printf("-1\n");
        }
        else
        {
    
    
            printf("%d\n",d[s][t]);
        }
        
    }
    return 0;
}

朴素Dijkstra代码

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>

using namespace std;

const int INF=0x3f3f3f3f;
const int N=210;

int n,m;
int g[N][N];
int vis[N],dis[N];

void Dijkstra(int u){
    
    
    memset(dis, 0x3f, sizeof(dis));
    for(int i=0;i<n;i++){
    
    
        dis[i]=g[u][i];//初始化指定起点到其它点的距离
    }
    dis[u] = 0;
    vis[u] = 1;
    for (int i = 0; i < n - 1; i ++ )
    {
    
    
        int t = -1;     // 在还未确定最短路的点中,寻找距离最小的点
        for (int j = 0; j < n; j ++ )
            if (!vis[j] && (t == -1 || dis[t] > dis[j]))
                t = j;

        // 用t更新其他点的距离
        for (int j = 0; j < n; j ++ )
            dis[j] = min(dis[j], dis[t] + g[t][j]);

        vis[t] = 1;
    }
}
int main()
{
    
    
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    
    
        memset(vis,0,sizeof(vis));
        memset(g,INF,sizeof(g));
        for(int i=0;i<m;i++)
        {
    
    
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            getchar();
            if(g[a][b]>c)
            {
    
    
                g[a][b]=g[b][a]=c;
            }
        }
        int s,t;
        scanf("%d%d",&s,&t);
        getchar();
        Dijkstra(s);
        if(dis[t]==INF)
            printf("-1\n");
        else
            printf("%d\n",dis[t]);
    }
    return 0;
}

SPFA代码

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>

using namespace std;

const int INF=0x3f3f3f3f;
const int N=210;

int n,m;
int g[N][N];
int vis[N],dis[N];

void SPFA(int u){
    
    
    memset(dis, 0x3f, sizeof(dis));
    
    dis[u] = 0;
    vis[u] = 1;
    
    queue<int> q;

    q.push(u);

    while(q.size())
    {
    
    
        auto t=q.front();
        q.pop();

        vis[t]=0;

        for(int i=0;i<n;i++)
        {
    
    
            if(dis[i]>dis[t]+g[t][i])
            {
    
    
                dis[i]=dis[t]+g[t][i];
                if(!vis[i])
                {
    
    
                    vis[i]=1;
                    q.push(i);
                }
            }
        }
    }
}
int main()
{
    
    
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    
    
        memset(vis,0,sizeof(vis));
        memset(g,INF,sizeof(g));
        for(int i=0;i<m;i++)
        {
    
    
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            getchar();
            if(g[a][b]>c)
            {
    
    
                g[a][b]=g[b][a]=c;
            }
        }
        int s,t;
        scanf("%d%d",&s,&t);
        getchar();
        SPFA(s);
        if(dis[t]>=INF)
            printf("-1\n");
        else
            printf("%d\n",dis[t]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Star_Platinum14/article/details/112505132