Dijkstra

pre.

#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1e6+10;
struct Edge{int u,v,w;}edge[2*maxn];
int head[maxn],cnt;
inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
int dis[maxn];
int n,m,s,u,v,w;
inline void dijkstra(int s)
{
//    memset(dis,0x7f,sizeof(dis));
    for(int i=1;i<=n;i++)dis[i]=2147483647;
    priority_queue<pair<int,int> > q;//pair<dis,point>
    q.push(make_pair(0,s)),dis[s]=0;
    while(!q.empty())
    {
        pair cur=q.front(),q.pop();
        for(int i=cur.second,;i;i=edge[i].u)
        {
            int v=edge[i].v;
            if(dis[v]>dis[cur]+edge[i].w)
                dis[v]=dis[cur]+edge[i].w,q.push(make_pair(dis[cur]+edge[i].w,v));
        }
    }
    for(int i=1;i<=n;i++)
        printf("%d ",dis[i]);
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    dijkstra(s);
    return 0;
}

 

#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1e6+10;
struct Edge{int u,v,w;}edge[2*maxn];
int head[maxn],cnt;
inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
int dis[maxn];
int n,m,s,u,v,w;
inline void dijkstra(int s)
{
//    memset(dis,0x7f,sizeof(dis));
    for(int i=1;i<=n;i++)dis[i]=2147483647;
    priority_queue<pair<int,int> > q;//pair<dis,point>
    q.push(make_pair(0,s)),dis[s]=0;
    while(!q.empty())
    {
        pair<int,int>cur=q.top();q.pop();
        for(int i=cur.second;i;i=edge[i].u)
        {
            int v=edge[i].v;
            if(dis[v]>dis[cur.second]+edge[i].w)
                dis[v]=dis[cur.second]+edge[i].w,q.push(make_pair(dis[cur.second]+edge[i].w,v));
        }
    }
    for(int i=1;i<=n;i++)
        printf("%d ",dis[i]);
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    dijkstra(s);
    return 0;
}

上面的代码是信息课上随手写的,当然是不过了,连样例都不过。

重写一份。

是忘记写head了。

堆优化Dijkstra:

#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1e6+10;
struct Edge{int u,v,w;}edge[2*maxn];
int head[maxn],cnt;
inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
int n,m,s,u,v,w;
int dis[maxn],vis[maxn];
inline void dijkstra(int s)
{
    fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0);
    typedef pair<int,int> sta;
    priority_queue<sta,vector<sta>,greater<sta> > q;
    q.push((sta){0,s}),dis[s]=0;
    while(!q.empty())
    {
        sta cur=q.top();vis[cur.second]=0,q.pop();
        for(int i=head[cur.second];i;i=edge[i].u)
        {
            int v=edge[i].v;
            if(dis[v]>dis[cur.second]+edge[i].w)
            {
                dis[v]=dis[cur.second]+edge[i].w;
                if(!vis[v])vis[v]=1,q.push((sta){dis[v],v});
            }
        }
    }
    for(int i=1;i<=n;i++)printf("%d ",dis[i]);
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<m;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w);
    dijkstra(s);
    return 0;
}
dijkstra
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 1000001
using namespace std;
struct Edge{int u,v,w;}edge[2*maxn];
int head[maxn],cnt;
int n,m,s,u,v,w;
int vis[maxn],dis[maxn],cur,nxt;
inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
inline void spfa(int u)
{
    queue<int>q;
    fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0),dis[u]=0,vis[u]=true,q.push(u);
    while(!q.empty())
    {
        cur=q.front(),vis[cur]=0,q.pop();
        for(int i=head[cur]; i; i=edge[i].u)
        {
            int v=edge[i].v;
            if(dis[v]>dis[cur]+edge[i].w)
            {
                dis[v]=dis[cur]+edge[i].w;
                if(!vis[v])vis[v]=1,q.push(v);
            }
        }
    }
    for(int i=1;i<=m;i++)printf("%d ",dis[i]);
}
int main()
{
    scanf("%d%d%d",&m,&n,&s);
    for(int i=0; i<n; i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w);
    spfa(s);
    return 0;
}
spfa

速度差不多,代码量也差不多。做个测试。

posted @ 2017-11-21 08:18  baka  阅读(489)  评论(0编辑  收藏  举报