【板子】单源最短路

来源:互联网 发布:linux usleep 精度 编辑:程序博客网 时间:2024/05/13 04:50

传送门

单源最短路

Code

dijkstra版本

#include<queue>#include<cstdio>#define f first#define s second  using namespace std;typedef pair<int,int> pii;const int inf = 2147483647;const int sn = 1e4+5;const int sm = 5e5+5;int n,m,st,tot;int hd[sn],d[sn];int to[sm],nxt[sm],w[sm];bool ex[sn]; priority_queue<pii,vector<pii>,greater<pii> >q;void Add(int a,int b,int c){    to[++tot]=b,w[tot]=c;    nxt[tot]=hd[a],hd[a]=tot;}void Dijkstra(int a) {    for(int i=1;i<=n;++i)d[i]=inf;    d[a]=0,q.push(make_pair(d[a],a));    while(!q.empty()) {        pii t=q.top();q.pop();        ex[t.s]=1;        for(int i=hd[t.s];i;i=nxt[i])            if(!ex[to[i]]&&w[i]+d[t.s]<d[to[i]]) {                d[to[i]]=w[i]+d[t.s];                q.push(make_pair(d[to[i]],to[i]));            }     }}int main() {    scanf("%d%d%d",&n,&m,&st);    for(int i=1,a,b,c;i<=m;++i)         scanf("%d%d%d",&a,&b,&c),Add(a,b,c);    Dijkstra(st);    for(int i=1;i<=n;++i)        printf("%d ",d[i]);    printf("\n");    return 0;}

SPFA版本

#include<cstdio>using namespace std;const int sm = 1e4+5;const int sn = 5e5+5;const int inf = 2147483647;int N,M,Ct,St,head,tail;int Que[10000005];int dis[sm],ex[sm];int to[sn],nxt[sn],len[sn],hd[sm];void read(int &x) {    char ch=getchar();x=0;    while(ch>'9'||ch<'0') ch=getchar();    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();}void Add(int u,int v,int w) {    to[++Ct]=v,nxt[Ct]=hd[u],len[Ct]=w,hd[u]=Ct;}void SPFA(int x) {    for(int i=1;i<=N;++i) dis[i]=inf;    Que[tail++]=x,ex[x]=1,dis[x]=0;    while(head<tail) {        int k=Que[head++];         ex[k]=0;        for(int i=hd[k];i;i=nxt[i])            if(dis[to[i]]>dis[k]+len[i]) {                dis[to[i]]=dis[k]+len[i];                if(!ex[to[i]]) {                    Que[tail++]=to[i];                    ex[to[i]]=1;                }            }    }}int main() {    read(N),read(M),read(St);    for(int i=1,x,y,z;i<=M;++i) {        read(x),read(y),read(z);        Add(x,y,z);    }    SPFA(St);    for(int i=1;i<=N;++i)        printf("%d ",dis[i]);    printf("\n");    return 0;}

最开始空间开反结果TLE了,汗~

原创粉丝点击