hdu 1874 通畅工程续(最短路模板)

来源:互联网 发布:乐视下载软件 编辑:程序博客网 时间:2024/05/17 05:03

Floyd o(n^3)

#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int n,m,a,b,t,f,e;const int inf=0x3f3f3f3f;int mp[300][300];void Floyd (){    for(int k=0;k<n;k++)        for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        mp[i][j]=min(mp[i][j],mp[i][k]+mp[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)//mp[i][j]=(i==j?0:inf);            mp[i][j]=0;        else mp[i][j]=inf;        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&t);            if(mp[a][b]>t)//对于数据1 1 10,询问1 1之间应该输出0,而不是10            mp[a][b]=mp[b][a]=t;        }        Floyd();        scanf("%d%d",&f,&e);        if(mp[f][e]==inf)            cout<<-1<<endl;        else cout<<mp[f][e]<<endl;//mo[i][j]表示i和j之间的最短路    }    return 0;}

Dijkstra o(n^2)

#include <iostream>#include <cstdio>using namespace std;const int N=300;const int inf=0x3f3f3f3f;int mp[N][N],vis[N],dis[N];int n,m,a,b,t,f,e;void init(){    for(int i=0;i<N;i++)        for(int j=0;j<N;j++)        if(i==j)//mp[i][j]=(i==j?0:inf);        mp[i][j]=0;    else mp[i][j]=inf;}void Dijkstra(int ss,int ee){    int p,minn;    for(int i=0;i<n;i++)    {        dis[i]=mp[ss][i];//若:起点为0,终点为n-1,输出为dis[n-1],改dis[i]=mp[0][i];        vis[i]=0;    }    vis[ss]=1;    for(int i=1;i<n;i++)    {        minn=inf;        for(int j=0;j<n;j++)        {            if(!vis[j]&&minn>dis[j])            {                minn=dis[j];                p=j;            }        }        vis[p]=1;        for(int j=0;j<n;j++)        {            if(!vis[j]&&dis[p]+mp[p][j]<dis[j])                dis[j]=dis[p]+mp[p][j];        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&t);            if(mp[a][b]>t)//mp[a][b]=mp[b][a]=min(mp[a][b],t);            mp[a][b]=mp[b][a]=t;//用min加<algorithm>        }        scanf("%d%d",&f,&e);        Dijkstra(f,e);        if(dis[e]==inf)            cout<<-1<<endl;        else cout<<dis[e]<<endl;//dis[end]放从开始到目标点的最短路    }    return 0;}


0 0
原创粉丝点击