最短路模板



SPFA:


void SPFA(int k)
{
                bool visit[1010];
                int d[1010];
                queue<int>a;
                int i,j;
                for(i=0;i<=N;i++)
                {
                      d[i]=INT_MAX;
                      visit[i]=false;
                }
                visit[k]=true; d[k]=0;
                a.push(k);
                while(a.empty()==false)
                {
                       int t=a.front();
                       a.pop();  visit[t]=false;
                       for(i=1;i<=N;i++)
                       if(edges[t][i]!=0 && i!=t)
                       {
                                      if(d[i]>d[t]+edges[t][i])
                                      {
                                           d[i]=d[t]+edges[t][i];
                                           if(visit[i]==false)
                                          {
                                                 a.push(i);
                                                 visit[i]=true;
                                          }
                                       }
                        }
                 }
}



Floyd:


/*g[i][j]表示i到j的最短路径*/
void floyd(){
	for(int k = 0; k < n; k++)
		for(int i = 0; i < n; i++)
			for(int j = 0; j < n; j++)
				if(g[i][k] < inf && g[k][j] < inf)
					g[i][j]=min(g[i][k] + g[k][j],g[i][j]);//从i到j经过k时的路径和直接从i到j的路径中取最小值
}



dijkstra:


//节点0到n-1
void dijkstra(int s)
{
	memset(visit,0,sizeof(visit));
	for(int i=0;i<n;i++)
	{
		dis[i]=g[s][i];
		pre[i]=s;
	}
	visit[s]=1;
	while(1)
	{
		int minn=1<<29,p=-1;
		for(int i=0;i<n;i++)
		{
			if(visit[i]==0 && dis[i]<minn)
			{
				minn=dis[i];p=i;
			}
		}
		if(p==-1)break;
		visit[p]=1;
		for(int i=0;i<n;i++)
		{
			if(visit[i]==0 && g[p][i]+dis[p]<dis[i])
			{
				dis[i]=g[p][i]+dis[p];
				pre[i]=p;
			}
		}
	}
}



你可能感兴趣的:(最短路模板)