• 【最短路】 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
    ",close[N]);
        return 0;
    }
  • 相关阅读:
    第3周 实践项目2 建设”顺序表“算法库(可参考为模板)
    第3周实践项目3 求集合并集
    【luogu 2529】【SHOI 2001】击鼓传花
    【BZOJ 3270】博物馆
    【BZOJ 2337】XOR和路径
    浅谈期望dp
    【codeforces 24D】Broken Robot
    【POJ 1463】Strategic game
    【POJ 3585】Accumulation Degree
    【luogu 3146/3147】248/262144
  • 原文地址:https://www.cnblogs.com/balfish/p/4015109.html
Copyright © 2020-2023  润新知