⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 公交车.c

📁 C++经典算法之 公交算法 常用算法 方便使用
💻 C
字号:
#include<stdio.h>
#define N 50
#define M 20

int g[N][N];
int a[N+1],dist[N],m,n;

void buildG()
{
   int i,j,k,sc,dd;
   printf("输入公交线路数,公交站数\n");
   scanf("%d,%d",&m,&n);
   for(i=0;i<n;i++)
	   for(j=0;j<n;j++) g[i][j]=0;
   for(i=0;i<m;i++)
   {
	   printf("沿第%d条公交线路前进方向的各站编号(0<=编号<=%d,-1结束):\n",i+1,n-1);
	   sc=0;
	   while(1)
	   {
		   scanf("%d",&dd);
		   if(dd==-1) break;
		   if(dd>=0&&dd<n) a[sc++]=dd;
	   }
	   a[sc]=-1;
	   for(k=1;a[k]>=0;k++)
		   for(j=0;j<k;j++)
			   g[a[j]][a[k]]=1;
   }
}

int minlen()
{
	int j,k;
	for(j=0;j<n;j++) dist[j]=g[0][j];
	dist[0]=1;
	do 
	{
		for(k=-1;j=0;j++)
			if(dist[j]>0&&(k==-1||dist[j]<dist[k])) k=j;
		if(k<0||k==n-1) break;
		dist[k]=-dist[k];
		for(j=1;j<n;j++)
			if(dist[j]>=0&&g[k][j]==1&&(dist[j]==0||-dist[k]+1<dist[j]))
				dist[j]=-dist[k]+1;
	} while(1);
	j=dist[n-1];
	return k<0?-1:j-1;
}

void main()
{
	int t;
	buildG();
	if ((t=minlen())<0) 
	{
     printf("无解!\n");
	} 
	else
	{
     printf("从0号站到%d站需要换车%d次\n",n-1,t);
	}
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -