一一题非常简单的单源无向正值最短路径图问题,用来练练手,分别用Dijkstra算法和prim算法做了一次,注释写得比较清楚了,看不懂可以先从下面的链接了解一下算法。
Dijkstra:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define loop(i,u,v) for(int i = u; i <= v; i++)
#define INF 0xffffff
#define N 105
int map[N][N],dis[N];
bool state[N];
void dijkstra(int n,int m)
{
dis[1] = 0;
state[1] = true;
int cut = 1; //最新加入已经true的点
loop(j,1,n)
{
if(state[j] == false)
{
if(dis[j] > dis[cut] + map[cut][j])
dis[j] = dis[cut] + map[cut][j];
}
}//更新所有点到起点的距离
loop(i,1,n)
{
int current_shortest = INF;
int possible_point;
loop(j,1,n)
{
if(state[j] == false)
{
if(current_shortest > dis[j] )
{
current_shortest = dis[j] ;
possible_point = j;
}
}
}//这个循环用来寻找集合[T]到集合[s]最近的点
state[possible_point] = true;
cut = possible_point;
//cout << "selected point" << cut << endl;
if(state[n] == true)
break;
loop(j,1,n)
{
if(state[j] == false)
{
if(dis[j] > dis[cut] + map[cut][j])
dis[j] = dis[cut] + map[cut][j];
}
} //这个循环通过当前离起点最近的点来更新所有未并入集合[S]的点到起点的距离
}
}
int main()
{
int n,m;
while(cin >> n >> m)
{
if(n == 0)
break;
memset(state,0,sizeof(state));
loop(i,1,n)
dis[i] = INF;
loop(i,1,n)
{
loop(j,1,n)
map[i][j] = INF;
}
int a,b,c;
loop(i,1,m)
{
scanf("%d%d%d",&a,&b,&c);
if(c < map[a][b])
map[a][b] = map[b][a] = c;
}
dijkstra(n,m);
cout << dis[n] << endl;
}
return 0;
}
prim:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define N 105
#define INF 0xffffff
int map[N][N];
void prim(int n)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
for(int k = 1; k <= n; k++)
{
map[j][i] = map[i][j] = min(map[i][j],map[i][k]+map[k][j]);
}
}//DP的思想,就是通过k点,可以找到i->k->j这条路比i->j短
}
}
int main()
{
int n,m;
while(cin >> n >> m)
{
if(n == 0)
break;
int a,b,c;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
map[i][j] = INF;
}
map[i][i] = 0;//注意,一定要将这条路长度设为0
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
prim(n);
cout << map[1][n] << endl;
}
return 0;
}
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
http://blog.csdn.net/zhongyanghu27/article/details/8221276