浙大计算机研究生复试上机考试2010年----最短路径问题

这道题是增加了一个花费的数据。。不过也不是大问题。。

不过最大问题是、这题的最坑爹之处。默认的测试数据里包含两个城市间有多条路径的情况。啊啊啊。。

这TM的研究生复试上机考试,会坑死一群奋斗了一年的倒霉的孩纸额。。。

#include <iostream>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXV=1005;
struct vertex
{
	int d;
	int p;
};
vertex cost[MAXV][MAXV];
vertex operator+(const vertex&a,const vertex&b)
{
	vertex c;
	c.d=a.d+b.d;
	c.p=a.p+b.p;
	return c;
}
void Dijkstra(int n,int v,int t)
{
	vertex dist[MAXV];
	bool s[MAXV];
	for(int i=1;i<=n;i++)
	{
		dist[i]=cost[v][i];
		s[i]=0;
	}
	s[v]=1;
	int k;
	for(int i=1;i<=n;i++)
	{
		int min=INF;
		for(int j=1;j<=n;j++)
		{
			if(s[j]==0&&dist[j].d<min)
			{
				k=j;
				min=dist[j].d;
			}
		}
		s[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(s[j]==0)
			{
				if(cost[k][j].d<INF&&dist[k].d+cost[k][j].d<dist[j].d)
					dist[j]=dist[k]+cost[k][j];
				else if(dist[k].d+cost[k][j].d==dist[j].d)
					if(dist[k].p+cost[k][j].p<dist[j].p)
						dist[j].p=dist[k].p+cost[k][j].p;
			}
		}
	}
	printf("%d %d\n",dist[t].d,dist[t].p);
}
int main()
{

	int n,m;
	while(scanf("%d%d",&n,&m))
	{
		if(n==0&&m==0)
			break;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cost[i][j].d=cost[i][j].p=INF;
			}
		}
		int a,b,d,p;
		while(m--)
		{
			scanf("%d%d%d%d",&a,&b,&d,&p);
			if(cost[a][b].d!=INF&&cost[a][b].d>d)
			{
				cost[a][b].d=cost[b][a].d=d;
				cost[a][b].p=cost[b][a].p=p;
			}
			else if(cost[a][b].d==INF)
			{
				cost[a][b].d=cost[b][a].d=d;
				cost[a][b].p=cost[b][a].p=p;
			}
		}
		int v,t;
		scanf("%d%d",&v,&t);
		Dijkstra(n,v,t);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值