hdu2544

来源:互联网 发布:.net防止sql注入 编辑:程序博客网 时间:2024/06/05 03:33

一一题非常简单的单源无向正值最短路径图问题,用来练练手,分别用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 105int 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 0xffffffint 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

0 0
原创粉丝点击