zoukankan      html  css  js  c++  java
  • 最短路-Prim算法 dijkstra算法

    HDU-1233

    #include <iostream>
    #define INF 1000000
    using namespace std;
    int Map[105][105];
    bool NewNode[105];
    bool OldNode[105];
    bool UsedNode[105];
    int lowcast[105];
    int main(int argc, const char * argv[]) {
        int n;
        cin.sync_with_stdio(false);
        while(cin>>n)
        {
            if(n==0)
                break;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    Map[i][j]=Map[j][i]=INF;
            for(int i=1;i<=n;i++)
            {
                NewNode[i]=false;
                OldNode[i]=true;
                lowcast[i]=INF;
            }
            for(int i=1;i<=n*(n-1)/2;i++)
            {
                int a,b,val;
                cin>>a>>b>>val;
                Map[a][b]=Map[b][a]=val;
            }
            int counter=1,pos=1,sum=0;
            while(counter!=n)
            {
                NewNode[pos]=true;
                OldNode[pos]=false;
                for(int i=1;i<=n;i++)
                {
                    if(OldNode[i]==true&&Map[pos][i]<lowcast[i])
                        lowcast[i]=Map[pos][i];
                }
                int Min=INF,Minpos;
                for(int i=1;i<=n;i++)
                {
                    if(OldNode[i]==true&&lowcast[i]<Min)
                    {
                        Minpos=i;
                        Min=lowcast[i];
                    }
                }
                pos=Minpos;
                counter++;
                    sum+=Min;
            }
            cout<<sum<<endl;
            
            
        }
        return 0;
    }

     dijkstra算法模板:

    #include <iostream>
    #include <vector>
    #include <queue>
    #define INF 20000000
    #define N 1005
    #define LL long long int
    using namespace std;
    int n,m,s,pos; //点,边,起点,终点
    LL ans;//总费用
    struct Node//记录指向点和路径费用
    {
        int pos,c;
        friend bool operator <(Node a,Node b)
        {
            return a.c>b.c;
        }
    };
    vector<Node> g[N];//临接表
    int dis[N];//距离数组
    void ini()//初始化
    {
        for(int i=1;i<=n;i++)
            g[i].clear();
        ans=INF;
    }
    void dij(int from)//输入起点
    {
        priority_queue<Node> q;
        fill(dis,dis+n+1,INF);
        dis[from]=0;
        Node now={from,0};
        q.push(now);
        while(!q.empty())
        {
            now=q.top(),q.pop();
            int v=now.pos;
            if(dis[v]<now.c)
                continue;
            for(int i=0;i<g[v].size();i++)
            {
                Node e;
                e=g[v][i];
                if(dis[e.pos]>dis[v]+e.c)
                {
                    dis[e.pos]=dis[v]+e.c;
                    Node next={e.pos,dis[e.pos]};
                    q.push(next);
                }
            }
        }
    }
  • 相关阅读:
    重谈MST及Kruskal算法
    小技巧—边权转点权
    JDOJ 1062 过路费
    总结—二分答案求解问题
    CF10D LCIS
    NOIP 2012 摆花
    SDOI 2014 旅行
    CF550C Divisibility by Eight
    CF295C Greg and Friends
    USACO Closing the Farm
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/5797888.html
Copyright © 2011-2022 走看看