单源通路最短(到各个顶点最短)

用的是dijkstra算法
详情请见学习通离散图论2.7章节

#include//栈溢出,按F11会运行,但会直接结束,并返回一个乱值。
#define max 1000000//1e6是浮点数!!! 
int arr0[1111][1111];//得放在堆中,不然溢出。
int min(int a,int b); 
int main(){
     
	int N=0,M=0,u=0,i=0,j=0,a=0,b=0,c=0,e=0,k=0,key=0;//M-边数,N-点数,key-序号,u-新顶点 
	int arr[1111]={
     1},D[1111]={
     0},flag[1111],D1[1111]={
     0},answer[1111]={
     0};//arr-集合s,arr0-赋权邻接矩阵
	scanf("%d %d",&N,&M);
	for(i=0;i<N;i++){
     
		for(j=0;j<N;j++)  arr0[i][j]=max;
	}
	for(i=0;i<N;i++)  arr0[i][i]=0;
	for(i=0;i<M;i++){
     
		scanf("%d %d %d",&a,&b,&c);
		arr0[a-1][b-1]=arr0[b-1][a-1]=c;
	}
	for(i=0;i<N;i++)  D[i]=arr0[0][i];
	//for(i=0;i
	D[0]=1000000;
	for(i=1;i<=N-1;i++){
     
		for(j=0;j<N;j++)  flag[j]=j+1;
		for(j=0;j<N;j++)  D1[j]=D[j];
		for(j=0;j<N-1;j++){
     
			for(k=0;k<N-j-1;k++){
     
				if(D1[k]>D1[k+1]){
     
					e=D1[k];
					D1[k]=D1[k+1];
					D1[k+1]=e;
					e=flag[k];
					flag[k]=flag[k+1];
					flag[k+1]=e;
				}
			}
		}
		//for(j=0;j
		u=flag[0];
		arr[u-1]=1;
		printf("%d\n",u);
		if(u==N)  break;
		//for(j=0;j
		for(j=0;j<N;j++){
     
			if(arr[j]==1)  continue;		
			D[j]=min(D[u-1]+arr0[u-1][j],D[j]);
		}
		answer[u-1]=D[u-1];
		D[u-1]=max;
		//for(j=0;j
	}
	//printf("%d\n",D[N-1]);
	//for(i=0;i
	return 0; 
}
int min(int a,int b){
     
	if(a<=b)  return a;
	else  return b;
}

你可能感兴趣的:(c语言)