【最短路】 poj 2387

#include <iostream>

#include <stdlib.h>

#include <limits.h>

#include <string.h>

using namespace std;

int map[1010][1010];

int dis[1010];

int n,pos,sum;

void init()

{

 for(int i=0; i<1001; i++)

 {

  for(int k=0; k<1001; k++)

   map[i][k] = INT_MAX;

  map[i][i] = 0;

 }

 for(int i=0; i<1001; i++)

  dis[i] = INT_MAX;

 sum = 0;

}

void Dijkstra()

{

 int used[1010];

 memset(used,0,sizeof(used));

 int now = pos;

 dis[now] = 0; used[now] = 1;

 for(int i=0; i<n; i++)

 {

  for(int k=1; k<=n; k++)

   if( map[now][k] != INT_MAX && dis[now] + map[now][k] < dis[k] )

    dis[k] = dis[now] + map[now][k];

  int min = INT_MAX;

  for(int k=1; k<=n; k++)

   if( dis[k] < min && !used[k] )

    min = dis[now = k];

  used[now] = 1;

 }

}

int main()

{

 int from,to,len,t;

 init();

 cin >> t >> n;

 pos = n;

 for(int i=1; i<=t; i++)

 {

  cin >> from >> to >> len;

  if( len < map[from][to] )

   map[from][to] = map[to][from] = len;

 }

 Dijkstra();

 cout << dis[1] << endl;

return 0;

}

 

 

 

#include<iostream>

using namespace std;

#define MAX 1005

const int oo=10000000;

int dist[MAX][MAX];

int close[MAX];

bool used[MAX];

int main()

{

    int N,T,i,j;

    int s,e,len;

    scanf("%d%d",&T,&N);

    memset(dist,0x7f,sizeof(dist));

    memset(used,false,sizeof(used));

    memset(close,0x7f,sizeof(close));

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

    {

        scanf("%d%d%d",&s,&e,&len);

        if(dist[s][e]>len)

            dist[s][e]=dist[e][s]=len;

    }

    for(i=2;i<=N;i++)

    {

        close[i]=dist[1][i];

    }

    used[1]=true;

    for(i=2;i<=N;i++)

    {

        int min=0;int mlen=oo;

        for(j=2;j<=N;j++)

        {

            if(!used[j]&&close[j]<mlen)

            {

                min=j,mlen=close[j];

            }

        }

        used[min]=true;

        for(j=2;j<=N;j++)

        {

            if(!used[j]&&dist[min][j]<oo)

            {

                int temp=dist[min][j]+close[min];

                if(temp<close[j])

                    close[j]=temp;

            }

        }

    }

    printf("%d\n",close[N]);

    return 0;

}

 

你可能感兴趣的:(poj)