1. 程式人生 > >某演算法的板子練習(四)

某演算法的板子練習(四)

堆優化dijkstra,在這個SPFA各種被卡的時代相當好用

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

inline int read()
{
    int f=1,x=0;
    char ch=getchar();
    while(ch<'
0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } struct node { int nx,dis; bool operator < (const node a) const { return a.dis<dis; } }f[100005]; priority_queue <node> q; int
n,m,s; int cnt; int head[100005],nxt[200005],v[200005],w[200005]; bool book[100005]; int i,j; void add(int x,int y,int z) { v[++cnt]=y; w[cnt]=z; nxt[cnt]=head[x]; head[x]=cnt; } int main() { n=read(); m=read(); s=read(); int x,y,z; for(i=1;i<=m;i++) { x=read(); y=read(); z=read(); add(x,y,z); }
for(i=1;i<=n;i++) f[i].dis=0x7fffffff/2,f[i].nx=i; f[s].dis=0; q.push(f[s]); while(!q.empty()) { x=q.top().nx; q.pop(); if(book[x]) continue; book[x]=1; for(i=head[x];i;i=nxt[i]) { y=v[i]; if(f[y].dis>f[x].dis+w[i]) { f[y].dis=f[x].dis+w[i]; if(!book[y]) q.push(f[y]);//這兩句一定不能寫反 } } } bool flag=0; for(i=1;i<=n;i++) { if(flag) printf(" "); printf("%d",f[i].dis); flag=1; } return 0; }

~NOIP2018 加油~