最短路-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);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/LukeStepByStep/p/5797888.html