poj3159 dijktstra+heap

来源:互联网 发布:机械图纸软件有哪些 编辑:程序博客网 时间:2024/06/15 18:02

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;}


0 0
原创粉丝点击