dijkstra堆优化模板

#include<bits/stdc++.h>
using namespace std;
int xx,yy,vv,dis[510],len=0,lin[510],T,n,m;
bool vis[510];
struct one
{
    int y,v,next;
};
one e[20100];
//priority_queue < pair < int , int > , vector<int> , greater<int> > q;
priority_queue < pair < int , int > > q;
void insert()
{
    e[++len].y=yy;e[len].v=vv;
    e[len].next=lin[xx];lin[xx]=len;
}
int main()
{
    //freopen("xf.in","r",stdin);
    //freopen("xf.out","w",stdout);
    scanf("%d%d%d",&T,&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&xx,&yy,&vv);
        insert();swap(xx,yy);insert();
    }
    memset(vis,false,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push(make_pair(0,1));
    while(q.size())
    {
        int x=q.top().second;q.pop();
        if(vis[x])continue; 
        vis[x]=true;
        for(int i=lin[x];i;i=e[i].next)
        {
            if(dis[e[i].y]>dis[x]+e[i].v)
            {
                dis[e[i].y]=dis[x]+e[i].v;
                q.push(make_pair(-dis[e[i].y],e[i].y));
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++)printf("%d\n",dis[i]);
    return 0;
}
/*#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
using namespace std;
int t,f,p,x[510][510],dis[11000],vis[11000],sum=0;
void dijkstra(int st)
{
    for(int i=1;i<=f;i++) dis[i]=x[st][i];
    memset(vis,0,sizeof(vis));
    vis[st]=1;dis[st]=0;
    for(int i=2;i<=f;i++)
    {
        int minn=999999999;
        int k=0;
        for(int j=1;j<=f;j++)
            if(vis[j]==0&&dis[j]<minn)
            {
                minn=dis[j];
                k=j;
            }
            if(k==0) return;
            vis[k]=1;
            for(int j=1;j<=f;j++)
            {
                if(vis[j]==0&&dis[k]+x[k][j]<dis[j])
                {
                    dis[j]=dis[k]+x[k][j];
                }
            }
    }
    
}
int main()
{
    memset(dis,9,sizeof(dis));
    memset(x,9,sizeof(x));
    scanf("%d%d%d",&t,&f,&p);
    for(int i=1;i<=p;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(x[a][b]>c)
        {
        x[a][b]=c;
        x[b][a]=c;
        }
    }
    dijkstra(1);
    for(int i=1;i<=f;i++)
        if(dis[i]<=t) sum++;
    cout<<sum<<endl;
    return 0;
}*/ 

 

posted @ 2020-09-01 15:17  mybing  阅读(139)  评论(0编辑  收藏  举报