poj3159 dijktstra+heap

dijkstra   複雜度n方,加上優先隊列複雜度nlogn

dijkstra+heap 換模板改模板,希望這個模板能用吧。。。

兩個結構體一個紀錄點一個紀錄邊

#include <iostream>
#include<stdio.h>
#include<cstdlib>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
#define mod 1000000007
#define ll long long
#define FOR(i,j,k) for(int i=j;i<=k;i++)
const int inf=0x3f3f3f3f;
const int N=30005;
int n,m;
struct node
{
    int id,val;
    node(int _id=0,int _val=0):id(_id),val(_val) {}
    bool operator < (const node & a) const
    {
        return val>a.val;
    }
};
struct Edge
{
    int v,next,w;
};
Edge edge[150005];
int head[N],k;
int vis[N];
int d[N];
void dijkstra(int start)
{
    priority_queue <node> que;
    node temp;
    int u,v,w;
    for(int i=1;i<=n;i++)
    {
        d[i]=inf;
        vis[i]=0;
    }
    que.push(node(start,0));
    d[start]=0;
    while(!que.empty())
    {
        temp=que.top();
        que.pop();
        u=temp.id;
        if(vis[u])
            continue;
        vis[u]=1;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            v=edge[i].v;
            w=edge[i].w;
            if(d[v]>d[u]+w&&!vis[v])
            {
                d[v]=d[u]+w;
                que.push(node(v,d[v]));
            }
        }
    }
}
void init()
{
    for(int i=1;i<=n;++i)
        head[i]=-1;
    k=0;
}
void addedge(int u,int v,int w)
{
    edge[k].v=v;
    edge[k].w=w;
    edge[k].next=head[u];
    head[u]=k++;
}
int main()
{
    scanf("%d %d",&n,&m);
    init();
    int a,b,c;
    while(m--)
    {
        scanf("%d%d%d",&a,&b,&c);
        addedge(a,b,c);
    }
    dijkstra(1);
    printf("%d\n",d[n]);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章