最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9833 Accepted Submission(s): 4225
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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条商店到赛场的路线。
输入保证至少存在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
dijkstra算法,邻接矩阵:单源最短路径O(v^2)
View Code
//#include "stdafx.h"
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <cstring>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;
//Constant Declaration
/*--------------------------*/
//#define LL long long
#define LL __int64
const int M=110;//最多点数
const int INF=1<<30;
const double EPS = 1e-11;
const double PI = acos(-1.0);
/*--------------------------*/
// some essential funtion
/*----------------------------------*/
void Swap(int &a,int &b){ int t=a;a=b;b=t; }
int Max(int a,int b){ return a>b?a:b; }
int Min(int a,int b){ return a<b?a:b; }
int Gcd(int a,int b){ while(b){b ^= a ^=b ^= a %= b;} return a; }
/*----------------------------------*/
//for (i = 0; i < n; i++)
/*----------------------------------*/
int d[M];//表示i到源点的最短距离
int g[M][M];//邻接矩阵
bool used[M];//标记i是否被用过
void init(int n)
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
g[i][j] = INF;//初始化图没有边,默认为INF,为了一定更新
}
}
for (i = 1; i <= n; i++)
{
d[i] = INF;
}
memset(used, 0, sizeof(used));
}
int dijkstra(int star, int end, int n)//起点,终点,总点数(编号为1,2...n)
{
int min_num;//最小值的位置
int i;
d[star] = 0;//起点到起点的最短距离为0,很重要的一步
for (int cnt = 0; cnt < n; cnt++)//注意别用while(n--),这样会改变n的值。n次贪心
{
int min = INF;
for (i = 1; i <= n; i++)
{
if (!used[i] && d[i] < min)
{
min = d[i];
min_num = i;
}
}
used[min_num] = 1;
//把d[min_num]作为中间点,对相邻的点做松弛
for (i = 1; i <= n; i++)
{
if (!used[i] && d[i] > d[min_num] + g[min_num][i])
{
d[i] = d[min_num] + g[min_num][i];
}
}
}
return d[end];
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//int t, case1 = 0;
//scanf("%d", &t);
int n, m;
int i, j;
while (scanf("%d%d", &n, &m), n + m)
{
init(n);
while (m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[b][a] = g[a][b] = c;//此题为无向图
}
printf("%d\n", dijkstra(1, n, n));
}
return 0;
}