C语言手写的堆优化Dijkstra,但二三个点RE了...
查看原帖
C语言手写的堆优化Dijkstra,但二三个点RE了...
267852
Faker1907楼主2020/11/8 23:18
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 500001
int dis[MAXN];
int u[MAXN],v[MAXN],w[MAXN];
int first[MAXN],next[MAXN];
int sign[MAXN];
int n,m,N=0;
int src,ed;
struct qu{
	int v;
	int dis;
};
struct qu que[MAXN];
struct qu tmp;
int read(){
	int p=0,f=1;	char	c=getchar();
	while (c<48||c>57)	{if (c=='-')	f=-1;	c=getchar();}
	while (c>=48&&c<=57)	p=(p<<1)+(p<<3)+c-48,c=getchar();
	return p*f;
}
void init()
{
    n=read();
    m=read();
    src=read();
    memset(first,-1,sizeof(first));
    int i;
    for(i=1;i<=m;i++){
    	u[i]=read();
    	v[i]=read();
    	w[i]=read();
        next[i]=first[u[i]];
        first[u[i]]=i;
    }
    for(i=1;i<=n;i++) dis[i]= (i==src? 0:1e10);
}
void wei_min(int i){
	int p;
	for(;(p=2*i)<=N;i=p){
		if(p+1<=N&&que[p].dis>que[p+1].dis){
			p++;
		}
		if(que[p].dis<que[i].dis){
			tmp=que[p];
			que[p]=que[i];
			que[i]=tmp;
		}
		else{
			break;
		}
	}
}
void pop() {
	que[1]=que[N--];
	wei_min(1);
}
void push(int dis,int v){
	int i,j;
	++N;
	que[N].v=v;
	que[N].dis=dis;
	for(i=N/2,j=N;i>=1&&que[i].dis>v;i/=2,j/=2){
		tmp=que[i];
		que[i]=que[j];
		que[j]=tmp;
	}
}
void dijkstra()
{
    push(0,src);
    int x,di,e;
    while(N!=0){
		x = que[1].v;
		di=que[1].dis;
        pop(); 
        if(di!=dis[x]) continue;  
        for(e=first[x];e!=-1;e=next[e]){ 
            if(dis[v[e]]>dis[x]+w[e]){
                 dis[v[e]]=dis[x]+w[e];
                 push(dis[v[e]],v[e]);
            }
        }
    }
 
}
int main()
{
    init();
    dijkstra();
    int i;
    for(i=1;i<=n;i++) printf("%d ",dis[i]);
}

全部手写的,不知道哪有问题,是不是队列用了struct而不是C++的pair就错了呀?

2020/11/8 23:18
加载中...