zoukankan      html  css  js  c++  java
  • hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图

    参考  http://blog.csdn.net/zhuyingqingfen/article/details/6370561

    刘汝佳白皮书

    #include<stdio.h>
    #include<queue>
    #include<iostream>
    #include<vector>
    using namespace std;
    #define N 2100
    #define inf  1000000000
    int n,m;
    struct node {
    int u,v,w,next;
    }bian[N];
    int yong,head[N];
    void creat(int u,int v,int w) {
    bian[yong].u=u;
    bian[yong].v=v;
    bian[yong].w=w;
    bian[yong].next=head[u];
    head[u]=yong++;
    }
    void  Dcreat(int u,int v,int w) {
    creat(u,v,w);
    creat(v,u,w);
    }
    int dijkstra(int u,int end) {
    int dis[N],i,j,visit[N];
    memset(visit,0,sizeof(visit));
    for(i=0;i<n;i++)
    dis[i]=inf;
    dis[u]=0;
         typedef pair<int ,int >p;//pair 定义了自己的排序规则--先比较第一维,相等才比较第二维 
    priority_queue<p,vector<p>,greater<p> >q;
    q.push(make_pair(dis[u],u));
    while(!q.empty()) {
    p cur=q.top();
    j=cur.second;
    q.pop();
    if(visit[j])continue;
    visit[j]=1;
    for(i=head[j];i!=-1;i=bian[i].next) 
    if(dis[bian[i].v]>dis[j]+bian[i].w) {
    dis[bian[i].v]=dis[j]+bian[i].w;
    q.push(make_pair(dis[bian[i].v],bian[i].v));
    }
    }

    if(dis[end]<inf)
    return dis[end];
    return -1;
    }
    int main() {
    int  i,j,a,b;
    while(scanf("%d%d",&n,&m)!=EOF) {
    yong=0;
    memset(head,-1,sizeof(head));
    while(m--) {
    scanf("%d%d%d",&a,&b,&j);
    Dcreat(a,b,j);
    }
    scanf("%d%d",&a,&b);
    printf("%d ",dijkstra(a,b));
    }
    return 0;
    }


    //定义结构体优先队列

    #include<stdio.h>
    #include<queue>
    #include<iostream>
    #include<vector>
    using namespace std;
    #define N 2100
    #define inf  1000000000
    int n,m;
    struct node {
    int u,v,w,next;
    }bian[N];
    int yong,head[N];
    void creat(int u,int v,int w) {
    bian[yong].u=u;
    bian[yong].v=v;
    bian[yong].w=w;
    bian[yong].next=head[u];
    head[u]=yong++;
    }
    void  Dcreat(int u,int v,int w) {
    creat(u,v,w);
    creat(v,u,w);
    }
    struct nodee {
    int len,v;
    friend bool  operator<(nodee a,nodee b) {
    if(a.len!=b.len)
    return a.len>b.len;
    return a.v>b.v;
    }
    };
    int dijkstra(int u,int end) {
    int dis[N],i,j,visit[N];
    memset(visit,0,sizeof(visit));
    for(i=0;i<n;i++)
    dis[i]=inf;
    dis[u]=0;
         //typedef pair<int ,int >p;
    //priority_queue<p,vector<p>,greater<p> >q;
    // q.push(make_pair(dis[u],u));
    priority_queue<nodee>q;
    nodee cur,now;
    cur.len=0;
    cur.v=u;
    q.push(cur);
    while(!q.empty()) {
    nodee cur=q.top();
    // j=cur.second;
    q.pop();
    if(visit[cur.v])continue;
    visit[cur.v]=1;
    for(i=head[cur.v];i!=-1;i=bian[i].next) 
    if(dis[bian[i].v]>dis[cur.v]+bian[i].w) {
    dis[bian[i].v]=dis[cur.v]+bian[i].w;
    now.len=dis[bian[i].v];
    now.v=bian[i].v;
    q.push(now);
    }
    }

    if(dis[end]<inf)
    return dis[end];
    return -1;
    }
    int main() {
    int  i,j,a,b;
    while(scanf("%d%d",&n,&m)!=EOF) {
    yong=0;
    memset(head,-1,sizeof(head));
    while(m--) {
    scanf("%d%d%d",&a,&b,&j);
    Dcreat(a,b,j);
    }
    scanf("%d%d",&a,&b);
    printf("%d ",dijkstra(a,b));
    }
    return 0;
    }

  • 相关阅读:
    jQuery基础学习5——JavaScript方法获取页面中的元素
    jQuery基础学习4——jQuery容错性
    jQuery基础学习3——jQuery库冲突
    jQuery基础学习2——DOM和jQuery对象
    Windows Server 2003 R2 64位简体中文版下载
    jQuery基础学习1
    关闭Linux里边的selinux
    linux下安装apache详解
    Autolayout学习(1)-了解Autoreszing
    新浪微博客户端(64)-下拉放大
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410864.html
Copyright © 2011-2022 走看看