【杭电oj】3790 - 最短路径问题(dijkstra)

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20049    Accepted Submission(s): 5961


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 

Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 

Output
输出 一行有两个数, 最短距离及其花费。
 

Sample Input
   
   
   
   
3 2 1 2 5 6 2 3 4 5 1 3 0 0
 

Sample Output
   
   
   
   
9 11
 

Source
浙大计算机研究生复试上机考试-2010年


第一次做最短路的问题还要考虑花费,有点痛苦啊,不过还是AC了。

要注意一下,这道题要考虑重复路径的问题(虽然题目没说),但是不考虑就得WA。

代码如下:

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX  1000000 
using namespace std;
int n,m;		
int st,en;

struct node
{
	int dis,cost;	
}dp[1111];

struct node2
{
	int dis,cost;
}s[1111][1111];	
int used[1111];	

void init()
{
	for (int i = 1;i <= n;i++)
	{
		dp[i].dis = MAX;
		dp[i].cost = MAX;
		used[i] = 0;
	}	
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			s[i][j].dis = MAX;
			s[i][j].cost = MAX;
		}
	}
}
int min(int a,int b)
{
	if (a<b)
		return a;
	return b;
}
void dijkstra()
{
	dp[st].dis = 0;
	dp[st].cost = 0;
	while (1)
	{
		int v = -1;
		for (int i = 1;i <= n;i++)
		{
			if (used[i]==0 && (dp[i].dis<dp[v].dis || v == -1))
				v = i;
		}
		if (v == -1)
			break;
		used[v] = 1;
		for (int i = 1;i <= n;i++)
		{
			if (dp[i].dis == dp[v].dis+s[v][i].dis)
			{
				dp[i].cost = min(dp[i].cost,dp[v].cost+s[i][v].cost);
			}
			else if (dp[i].dis > dp[v].dis+s[v][i].dis)
			{
				dp[i].dis = dp[v].dis+s[i][v].dis;
				dp[i].cost = dp[v].cost+s[i][v].cost;
			}
		}
	}
}

int main()
{
	while (~scanf ("%d %d",&n,&m) && (n||m))
	{
		init();
		while (m--)
		{
			int t1,t2,t3,t4;
			scanf ("%d %d %d %d",&t1,&t2,&t3,&t4);
			if ((s[t1][t2].dis == t3 && s[t1][t2].cost > t4) || s[t1][t2].dis > t3)		//考虑重复路径 
			{
				s[t1][t2].dis = t3;
				s[t1][t2].cost = t4;
				s[t2][t1].dis = t3;
				s[t2][t1].cost = t4;
			}
		}
		scanf ("%d %d",&st,&en);
		dijkstra();
		printf ("%d %d\n",dp[en].dis,dp[en].cost);
	}
	return 0;
}


你可能感兴趣的:(【杭电oj】3790 - 最短路径问题(dijkstra))