hihoCoder1081 1089 1093 :最短路径

来源:互联网 发布:人工智能高端人才 编辑:程序博客网 时间:2024/05/08 03:06

hihoCoder1081 最短路径一

题目连接:http://hihocoder.com/problemset/problem/1081


分析:求单源最短路径,点集和边集都不大,邻接矩阵存储即可。


Dijkstra算法实现代码如下:

#include <cstdio>#include <iostream>#define INF 999999999#define MAX 10005using namespace std;int s[MAX];int dist[MAX],ans[MAX][MAX];void Dijkstra(int n,int v){    int newdist,temp,u,i,j;    for(i=1; i<=n; i++)    {        dist[i]=ans[v][i];        s[i]=0;    }    dist[v]=0;    s[v]=1;    for(i=1; i<=n; i++)    {        temp=INF;        u=v;        for(j=1; j<=n; j++)            if((!s[j])&&(dist[j]<temp))            {                u=j;                temp=dist[j];            }        s[u]=1;        for(j=1; j<=n; j++)            if((!s[j])&&(ans[u][j]<INF))            {                newdist=dist[u]+ans[u][j];                if(newdist<dist[j])  dist[j]=newdist;            }    }}int main(){    int m,n,start,end;    int a,b,t;    scanf("%d%d%d%d",&n,&m,&start,&end);    for(int i=0; i<=n; i++)        for(int j=0; j<=n; j++)            ans[i][j]=INF;    for(int i=1; i<=m; i++)    {        scanf("%d%d%d",&a,&b,&t);        if(ans[a][b]>t)        {            ans[a][b]=t;            ans[b][a]=t;        }    }    Dijkstra(n,start);    printf("%d\n",dist[end]);    return 0;}



hihoCoder1089  最短路径二:Floyd算法

题目链接:http://hihocoder.com/problemset/problem/1089


分析:题目都已经说的这么明确了==。毕竟,求任意两点之间的最短路Floyd比Dijkstra效率是要高很多。


实现代码如下:

#include <cstdio>#include <iostream>#define INF 999999999#define MAX 1005using namespace std;int dist[MAX][MAX];void Floyd(int n){    int i,j,k;    for(k=1;k<=n;k++)      for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        {            int temp=dist[i][k]+dist[k][j];            if(dist[i][j]>temp)  dist[i][j]=temp;        }    for(i=1;i<=n;i++)    {        for(j=1;j<=n;j++)          printf("%d ",dist[i][j]);        printf("\n");    }}int main(){    int m,n;    int a,b,t;    scanf("%d%d",&n,&m);    for(int i=0; i<=n; i++)        for(int j=0; j<=n; j++)            dist[i][j]=INF;    for(int i=0;i<=n;i++)  dist[i][i]=0;    for(int i=1; i<=m; i++)    {        scanf("%d%d%d",&a,&b,&t);        if(dist[a][b]>t)        {            dist[a][b]=t;            dist[b][a]=t;        }    }    Floyd(n);    return 0;}


hihoCoder1093 最短路径三:SPFA算法

题目链接:http://hihocoder.com/problemset/problem/1093


分析:SPFA不如Dijkstra算法稳定的原因就在于:SPFA对于稀疏图(图中边数较少)有着比较高的效率。本题已经说的很明确了:“鬼屋很大,但道路并不多”,加之m和n的范围比较大,不能用邻接矩阵,这里用vector容器来装了。

实现代码如下:

#include <cstdio>#include <iostream>#include <queue>#include <vector>using namespace std;#define INF 0x7fffffff#define MAX 100005struct edge{    int to,w;};int dis[MAX];bool vis[MAX];int n,m,start,e;vector <edge> vec[MAX];void SPFA(){    for(int i=1;i<=n;i++)    {        dis[i]=INF;        vis[i]=false;    }    dis[start]=0;    queue<int> que;    que.push(start);    vis[start]=true;    while(!que.empty())    {        int tmp=que.front();        que.pop();        vis[tmp]=false;        for(int i=0;i<vec[tmp].size();i++)        {            edge cnt=vec[tmp][i];            if(dis[ cnt.to ]>dis[tmp]+cnt.w)            {                dis[ cnt.to ]=dis[tmp]+cnt.w;                if(!vis[ cnt.to ])                {                    que.push(cnt.to);                    vis[ cnt.to ]=true;                }            }        }    }}int main(){    cin>>n>>m>>start>>e;    for(int i=0;i<=n;i++)      vec[i].clear();    for(int i=1;i<=m;i++)    {        edge cnt1,cnt2;        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        cnt1.to=u;cnt1.w=w;        cnt2.to=v;cnt2.w=w;        vec[u].push_back(cnt2);        vec[v].push_back(cnt1);    }    SPFA();    cout<<dis[e]<<endl;    return 0;}


0 0
原创粉丝点击