hdu 2544 最短路

来源:互联网 发布:达内软件培训班 编辑:程序博客网 时间:2024/06/14 04:13

这道题用来测试优先队列优化


首先是最普通的dijkstra

//http://acm.hdu.edu.cn/showproblem.php?pid=2544#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <string.h>#define INF 0x3f3f3f3fusing namespace std;const int maxn=105;int n,m;int dis[maxn][maxn];bool vis[maxn];int d[maxn];int a,b,c;void dijkstra(){    memset(d,0x3f,sizeof(d));    memset (vis,false ,sizeof(vis));    d[1]=0;    for(int i=1;i<=n;i++)    {        int minn=INF;        int k=-1;        for(int j=1;j<=n;j++)            if(!vis[j]&&minn>d[j])                minn=d[k=j];        if(k==-1) break;        vis[k]=true;        for(int j=1;j<=n;j++)            if(!vis[j]&&d[j]>d[k]+dis[k][j])                d[j]=d[k]+dis[k][j];    }    cout<<d[n]<<endl;}int main(){    //freopen("input.txt","r",stdin);    while(cin>>n>>m,n)    {        memset(dis,0x3f,sizeof(dis));        for(int i=1;i<=m;i++)        {            cin>>a>>b>>c;            if(c<dis[a][b])                dis[a][b]=dis[b][a]=c;        }        dijkstra();    }    return 0;}


然后是优先队列的优化。。。  储存图的方式仍然是矩阵存法。。。

#include <cstdio>#include <iostream>#include <cmath>#include <string>#include <cstring>#include <cstdlib>#include <algorithm>#include <stack>#include <map>#include <set>#include <vector>#include <queue>#define ll long longusing namespace std;const int INF = 0x3f3f3f3f;const int maxn =  102;int g[maxn][maxn];int vis[maxn];int d[maxn];int a,b,c;int n,m;typedef pair <int ,int> pii;void dijkstra(int s){memset(d,0x3f,sizeof(d));    memset (vis,false ,sizeof(vis));    d[1]=0;    priority_queue <pii,vector<pii>,greater<pii> >q;    q.push(make_pair(d[1],1));    while(!q.empty())    {    pii t=q.top(); q.pop();    int now=t.second;    if(vis[now]) continue;    vis[now]=true;    for(int j=1;j<=n;j++)    if(!vis[j]&&g[now][j]<INF&&d[j]>d[now]+g[now][j])    d[j]=d[now]+g[now][j],    q.push(make_pair(d[j],j));    }    cout<<d[n]<<endl;}int main(){    //freopen("input.txt","r",stdin);    while(cin>>n>>m,n)    {        memset(g,0x3f,sizeof(g));        for(int i=1;i<=m;i++)        {            cin>>a>>b>>c;            if(c<g[a][b])                g[a][b]=g[b][a]=c;        }        dijkstra(1);    }    return 0;}




这道题数据不是很多,,优化效果还不是很明显的。。

0 0
原创粉丝点击