在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 
 

Input

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 
输入保证至少存在1条商店到赛场的路线。 

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output

3
2

主要是想熟练一下用vector存储地图, 顺道复习一下最短路

这个代码是用邻接矩阵存哒:
 

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1000000;
int book[maxn] , data[100][100] , dis[maxn];
int n , m , minn , u;
void Dijkstra()
{
	for(int i = 1 ; i <= n-1 ; i++)
	{
		minn = maxn;
		for(int j = 1 ; j <= n ; j++)
		{
			if(book[j] == 0 && dis[j] < minn)
			{
				minn = dis[j];
				u = j;
			}
		}
		book[u] = 1;
		for(int k = 1 ; k <= n ; k++)
		{
			if(data[u][k] < maxn)
			{
				if(dis[k] > dis[u] + data[u][k])
				{
					dis[k] = dis[u] + data[u][k];
				}
			}
		
		}
	}
}
int main()
{
	int a , b , c;
	while(~scanf("%d %d" , &n , &m) && ( n + m ))
	{
		memset(book , 0 , sizeof(book));
		memset(dis , 0 , sizeof(dis));
		for(int i = 1 ; i <= n ; i++)
		{
			for(int j = 1 ; j <= n ; j++)
			{
				if(i == j)
				{
					data[i][j] = 0;
				}
				else
				{
					data[i][j] = maxn;
				}
			}
		}
		while(m--)
		{
			cin >> a >> b >> c;
			data[a][b] = data[b][a] = c;
		}
		for(int i = 1 ; i <= n ; i++)
		{
			book[i] = 0;
		}
		book[1] = 1;
		for(int i = 1 ; i <= n ; i++)
		{
			dis[i] = data[1][i];
		}
		Dijkstra();
	//	for(int i = 1 ; i <= n ; i++)
	//	{
			printf("%d\n" , dis[n]);
	//	}
	}

	return 0;
}

介个代码是用vector存哒

#include <stdio.h>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1000000;
int book[maxn] , dis[maxn];
int n , m , minn , u;
struct node
{
	int to;
	int cost;
	node(int _to,int _cost):to(_to), cost(_cost) {}
};
vector<node>V[maxn];
void Dijkstra()
{
	for(int i = 1 ; i <= n-1 ; i++)
	{
		minn = maxn;
		for(int j = 1 ; j <= n ; j++)
		{
			if(book[j] == 0 && dis[j] < minn)
			{
				minn = dis[j];
				u = j;
			}
		}
	//	printf("U = %d\n",u);
		book[u] = 1;
		for(int k = 0 ; k < V[u].size() ; k++)
		{
			int v = V[u][k].to;
			int w = V[u][k].cost;
			
				if(dis[v] > dis[u] + w)
				{
					dis[v] = dis[u] + w;
				}
			
		
		}
	}
}
int main()
{
	int temp1;
	while(~scanf("%d %d" , &n , &m) && ( n + m ))
	{
		memset(book , 0 , sizeof(book));
		int u,v,cost;  
	//	memset(dis , 0 , sizeof(dis));
		for(int i = 0 ; i < maxn ; i++) V[i].clear();
		while(m--)
		{
			scanf("%d %d %d" , &u , &v , &cost);
			V[u].push_back(node(v,cost));
			V[v].push_back(node(u,cost));
		}
		for(int i = 1 ; i <= n ; i++)
		{
			book[i] = 0;
		}
		book[1] = 1;
		memset(dis,INF,sizeof(dis));
		for(int i = 0 ; i < V[1].size() ; i++)
		{
			dis[V[1][i].to] = V[1][i].cost;
		}
		dis[1] = 0;
		Dijkstra();
	//	for(int i = 1 ; i <= n ; i++)
	//	{
			printf("%d\n" , dis[n]);
	//	}
	}

	return 0;
}

介个是SPFA的代码:

#include<stdio.h>
#include <iostream>
#include <vector>
#include <queue> 
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
int dis[maxn] , vis[maxn] , ans[maxn];
int n , m;
struct node
{
	int to;
	int cost;
	node(int _to , int _cost):to(_to) , cost(_cost){
	}
};
vector<node>V[maxn];
bool SPFA(int s , int e)
{
	for(int i = 0 ; i <= n ; i++)
	{
		dis[i] = INF;
	}
	dis[s] = 0;
	queue<int>q;
	q.push(s);
	ans[s] = 1;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for(int i = 0 ; i < V[u].size() ; i++)
		{
			int to = V[u][i].to;
			int w = V[u][i].cost;
			if(dis[to] > dis[u] + w)
			{
				dis[to] = dis[u] + w;
				if(!vis[to])
				{
					vis[to] = 1;
					ans[to]++;
					q.push(to);
					if(ans[to] > e)
					{
						return false;
					}
				}
			}
		}
	}
	return true;
}
int main()
{
	while(~scanf("%d %d" , &n , &m) && (n+m))
	{
		for(int i = 0 ; i < n ; i++)V[i].clear();
		while(m--)
		{
			int u , v , cost;
			scanf("%d %d %d" , &u , &v , &cost);
			V[u].push_back(node(v , cost));
			V[v].push_back(node(u , cost));
		}
		SPFA(1,n);
	
		printf("%d\n",dis[n]);
	
	}
	return 0 ;
}