1. 程式人生 > 實用技巧 >dijkstra堆優化模板

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