链接:​​click here​

题意:


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


Input


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




Output


对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
思路:很裸很裸的最短路问题,注意 考虑重复的路,也就是输入的两点U,V相同,这时存储的要是其中最小的quan(权值)。
参考代码:

#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Inf=0x3f3f3f3f;
const int maxn=10100;
int cost[maxn][maxn]; //存图
int d[maxn]; //从s出发的最短路径
bool used[maxn]; //已经使用过的图
int V; //顶点数
int city[maxn];
void dijkstra(int s)
{
for(int i=0; i<V; i++)
d[i]=cost[s][i];
memset(used,false,sizeof(used));
d[s]=0;
used[s]=true;
while(true)
{
int v=-1;
for(int u=0; u<V; u++)
{
if(!used[u]&&(v==-1||d[u]<d[v]))
v=u;
}
if(v==-1) break;
used[v]=true;
for(int u=0; u<V; u++)
{
d[u]=min(d[u],d[v]+cost[v][u]);
}
}
//return d[V];
}
int main()
{
int M,i,j;
while(~scanf("%d%d",&V,&M),V+M)
{
memset(cost,Inf,sizeof(cost));
int u,v,quan;
for(i=0; i<M; i++)
{
scanf("%d%d%d",&u,&v,&quan);
if(cost[u][v]>quan)
cost[u][v]=cost[v][u]=quan;
}
dijkstra(V);
printf("%d\n",d[1]);
}
return 0;
}


从其他博客看到另外三种方法,写的很全面,仅供参考:


/*
链接:http://gzhu-101majia.iteye.com/blog/1150170
*/

#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 105;
const int INF = 99999999;
int map[N][N], dist[N];
bool visit[N];
int n, m;
void init() //初始化
{
int i, j;
for(i = 1; i < N; i++)
{
for(j = 1; j < N; j++)
{
if(i == j) map[i][j] = 0;
else map[i][j] = map[j][i] = INF;
}
}
}

void input() //输入函数
{
int vi, vj, cost;
while(m--)
{
scanf("%d %d %d", &vi, &vj, &cost);
if(cost < map[vi][vj])
map[vi][vj] = map[vj][vi] = cost;
}
}

void floyd() //Floyd算法
{
int i, j, k;
for(k = 1; k <= n; k++) //k为中间点
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(map[i][k] + map[k][j] < map[i][j])
map[i][j] = map[i][k] + map[k][j];
}

void dijkstra() //Dijkstra算法
{
int i, j, next, MIN;
memset(visit, false, sizeof(visit));
for(i = 1; i <= n; i++) dist[i] = INF;
dist[1] = 0;
for(i = 1; i <= n; i++)
{
MIN = INF;
for(j = 1; j <= n; j++)
if(!visit[j] && dist[j] <= MIN)
MIN = dist[next=j];
if(MIN == INF) break;
visit[next] = true;
for(j = 1; j <= n; j++)
if(!visit[j] && dist[j] > dist[next] + map[next][j])
dist[j] = dist[next] + map[next][j];
}
}

void spfa() //SPFA算法
{
int i, now;
memset(visit, false, sizeof(visit));
for(i = 1; i <= n; i++) dist[i] = INF;
dist[1] = 0;
queue<int> Q;
Q.push(1);
visit[1] = true;
while(!Q.empty())
{
now = Q.front();
Q.pop();
visit[now] = false;
for(i = 1; i <= n; i++)
{
if(dist[i] > dist[now] + map[now][i])
{
dist[i] = dist[now] + map[now][i];
if(visit[i] == 0)
{
Q.push(i);
visit[i] = true;
}
}
}
}
}
int main()
{
while(scanf("%d %d", &n, &m))
{
if(!n || !m) break;
init();
input();
floyd();
//dijkstra();
//spfa();
printf("%d\n", map[1][n]);
//printf("%d\n", dist[n]);
}
return 0;
}

测试数据:
/*
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
*/