最短路径(随便写写)(Floyd,Bellman-Ford,Dijkstra)

3种常用的最短路径算法

最初学的算法之一,(之3),好怀念啊

 

#include<bits/stdc++.h>
using namespace std;
int n,m,p;
int dis[1000],f[1000][1000],k,ans,minn=1e9,v,b,w;
bool t[1000];

void input1()
{
    cin>>n>>m>>p;
    memset(dis,0x7f,sizeof(dis));
    memset(f,0x7f,sizeof(f));
    memset(t,0,sizeof(t));
    dis[p]=0;
    t[p]=true;
    for(int i=1;i<=m;i++)
    {
        cin>>v>>b>>w;
        f[i][i]=0;
        f[v][b]=f[b][v]=w;
    }
    for(int i=1;i<=n;i++)
    dis[i]=min(dis[i],f[p][i]);
}
void dijkstra()
{
    for(int i=1;i<=n-1;i++)
    {
        minn=1e9;
        k=0;
        for(int i=1;i<=n;i++)
        {
            if(!t[i]&&dis[i]<minn)
            {
                minn=dis[i];
                k=i;
            }
        }
        if(k==0) break;
        t[k]=true;
        for(int i=1;i<=n;i++)
        if(i!=k)
        dis[i]=min(dis[i],dis[k]+f[k][i]);
    }
    for(int i=1;i<=n;i++)
    cout<<i<<' '<<':'<<' '<<dis[i]<<endl;
}
void text1_dijkstra()
{
    input1();
    dijkstra();
}

struct ed
{
    int from;
    int next;
    int weight;
} edge[1000];
void input2()
{
    cin>>n>>m>>p;
    memset(dis,0x7f,sizeof(dis));
    dis[p]=0;
    for(int i=1;i<=m;i++)
    {
        cin>>edge[i].from>>edge[i].next>>edge[i].weight;
        if(edge[i].from==p) dis[edge[i].next]=edge[i].weight;
    }
}
void relax(int u1,int v1,int w1)
{
    if(dis[v1]>dis[u1]+w1)
    dis[v1]=dis[u1]+w1;
}
int bellman_ford()
{
    for(int i=1;i<=n-1;i++)
    for(int j=1;j<=m;j++)
    relax(edge[j].from,edge[j].next,edge[j].weight);
    bool fool=false;
    for(int i=1;i<=m;i++)
    if(dis[edge[i].from]>dis[edge[i].next]+edge[i].weight)
    {
        fool=true;
        break;
    }
    if(!fool)
    for(int i=1;i<=n;i++)
    cout<<i<<' '<<':'<<' '<<dis[i]<<endl;
}
void text2_bellman_ford()
{
    input2();
    bellman_ford();
}

void input3()
{
    cin>>n>>m>>p;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    f[i][j]=1e8;
    for(int i=1;i<=m;i++)
    {
        cin>>v>>b>>w;
        f[i][i]=0;
        f[v][b]=f[b][v]=w;
    }
}
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i!=k&&i!=j&&j!=k)
                f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
            }
        }
    }
    for(int i=1;i<=n;i++)
    if(i!=p)
    cout<<i<<' '<<':'<<' '<<f[p][i]<<endl;
}
void text3_floyd()
{
    input3();
    floyd();
}

int main()
{
    //text1_dijkstra();//迪杰斯特拉算法 
    //text2_bellman_ford();//贝尔曼-福特算法
    //text3_floyd();//弗洛伊德算法
    return 0;
}

 

ps(这里的Bellman-Ford是处理有向图的,处理无向图只需将input2的循环里加上if(edge[i].next==p) dis[edge[i].from]=edge[i].weight;)

虽然还有许多其他算法,比如说SPFA,但某蒟蒻就不写了,懒。。。

posted @ 2020-03-24 22:17  RW_wbd  阅读(230)  评论(0编辑  收藏  举报