zoj 2526

最短路问题,要求出最短路的个数。

输出一条得到JavaBean最多的最短路径








#include<stdio.h>
#include<string.h>
#define inf 0x3fffffff
int n,m,map[510][510],dp[510],mark[510],dis[510],w[510],pre[510],link[510];
int st,ed;
void dijkstra()
{
	int i,j,k,min;
	memset(mark,0,sizeof(mark));//标记房间是否走过
	memset(dp,0,sizeof(dp));//记录到达位置得到最多的JavaBean
	memset(pre,-1,sizeof(pre));//记录到达此房间的前一个房间
	memset(link,0,sizeof(link));//记录到达此位置最短路的个数
	for(i=0;i<n;i++)
		dis[i]=inf;//距离起点的最短距离
	dis[st]=0;
	link[st]=1;
	dp[st]=w[st];
	for(i=0;i<n;i++)
	{
		min=inf;k=-1;
		for(j=0;j<n;j++)
		{
			if(!mark[j]&&min>dis[j])
			{
				min=dis[j];
				k=j;
			}
		}
		mark[k]=1;
		for(j=0;j<n;j++)
		{
			if(mark[j]||dis[j]<dis[k]+map[k][j]||map[k][j]==inf)continue;
			if(dis[j]==dis[k]+map[k][j])//如果从k到达j的距离与j的最小距离相等
				link[j]+=link[k];//j的最短路数要加上k的
			else link[j]=link[k];//如果从k到达j的路短的话,到达j的最短路数就等于k的最短路数
			if(dis[j]>dis[k]+map[k][j]||dp[j]<dp[k]+w[j])//路径更短或者路劲相等得到的JavaBean更多
			{		
				dis[j]=dis[k]+map[k][j];
				pre[j]=k;
				dp[j]=dp[k]+w[j];
			}			
		}
	}	
}
void prit(int u)
{
	if(u==st){printf("%d",st);return;}
	prit(pre[u]);
	printf(" %d",u);
}
int main()
{
	int i,j,x,y,p;
	while(scanf("%d%d%d%d",&n,&m,&st,&ed)!=-1)
	{
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				map[i][j]=inf;
			for(i=0;i<n;i++)
				scanf("%d",&w[i]);
			for(i=0;i<m;i++)
			{
				scanf("%d%d%d",&x,&y,&p);
				if(map[x][y]>p)
					map[x][y]=map[y][x]=p;
			}
			dijkstra();
			printf("%d %d\n",link[ed],dp[ed]);
			prit(ed);
			printf("\n");
	}
	return 0;
}


5 10 0 2
1 2 1 5 3
0 1 2
0 2 4
0 3 3
0 4 1
1 2 2
1 3 1
1 4 1
2 3 1
2 4 3
3 4 2






你可能感兴趣的:(编程,算法,百度,Google,ACM)