您的位置:首页 > 其它

poj 2387 简单的dijkstra运用

2013-12-14 20:05 387 查看
题意: 给出n 个农场 , 和t条双向路径  , 求从农场1 到 你的最短距离?

出题人有意思 , 输入时  ,题目先输入 t , 再输入 n

#include

#include

#include

#include

using namespace std;

#define max(u , v)  (u)>(v)?(u):(v)

#define min(u , v) 
(u)<(v)?(u):(v)   

const int INF = 0xfffffff;

const int maxn = 2010;

int grap[maxn][maxn] , dist[maxn] , pre[maxn];

int n , m ;

void init()

{

    int i ,
j;

    for(i = 1; i
<= n; i++)

   
    for(j = 1; j
<= n; j++)

   
   
    grap[i][j] =
INF;

    memset(pre ,
0 , sizeof(pre));

}

void dijkstra()

{

    int i ,
j;

    for(i = 1; i
<= n; i++)

   
    dist[i] =
grap[1][i];

    pre[1] =
1;

    int x =
1;

    for(j = 1; j
< n; j++)

    {

   
    int maxs
=INF;

   
    for(i = 1; i
<= n; i++)

   
   
    if(!pre[i]
&& maxs > dist[i])

   
   
    {

   
   
   
    maxs =
dist[i];

   
   
   
    x = i;

   
   
    }

   
    pre[x] =
1;

   
//   
cout<<dist
<<endl;

   
    for(i = 1; i
<= n; i++)

   
   
    if(!pre[i]
&& (grap[x][i]+dist[x]) < dist[i] )

   
   
   
    dist[i] =
grap[x][i] + dist[x];

    }

}

int main()

{

   
while(scanf("%d %d" , &m , &n) != EOF)

    {

   
   
init();

   
    int i , x ,
y , z;

   
    for(i = 0; i
< m; i++)

   
    {

   
   
    scanf("%d %d
%d" , &x , &y , &z);

   
   
   
if(grap[x][y] > z)

   
   
   
    grap[x][y] =
grap[y][x] = z;

   
    }

   
   
dijkstra();

   
   
cout<<dist
<<endl;

    }

    return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: