prim poj1258 luogu3366

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,w[105][105],l[105],vis[105],kmin,sum=0;
int main()
{
    //多組輸入
    while(~scanf("%d",&n))
    {
        memset(vis,0,sizeof vis);
        sum=0;

        memset(w,0x3f3f3f3f,sizeof w);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&w[i][j]);
    //  for(int i=1;i<=n;i++)
    //  {
    //      for(int j=1;j<=n;j++)
    //          cout<<w[i][j]<<" ";
    //      cout<<endl;
    //  }

        memset(l,0x3f3f3f3f,sizeof l);l[1]=0;
        int k;
        for(int i=1;i<=n;i++)
        {
            kmin=0x3f3f3f3f;
            for(int j=1; j<=n;j++)
            {
                if(!vis[j] && l[j]<kmin)///////////////
                    k=j,kmin=l[j];
            }
    //      cout<<k<<","<<kmin<<endl;

            vis[k]=1;
            sum+=l[k];
            for(int j=1;j<=n;j++)
            {
                if(!vis[j] && w[k][j]<l[j])
                    l[j]=w[k][j];
    //          cout<<k<<","<<j<<","<<l[j]<<endl;
            }
    //      cout<<endl;
    //      cout<<endl;
        }
        cout<<sum<<endl;
    }
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int n,w[105][105],k,l[105],vis[105],sum,u,cnt;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
void prim()
{
    memset(vis,0,sizeof vis);
    memset(l,0x3f3f3f3f,sizeof l);
    sum=0;
    q.push(make_pair(0,1));
    while(!q.empty() && cnt<n)
    {
        k=q.top().second;//權值最小的點 
        u=q.top().first;
        q.pop() ;
        if(vis[k]) continue;
        vis[k]=1;//////////////////////////
        sum+=u; 
//      cout<<k<<"_____"<<u<<"______"<<sum<<endl;       
        for(int j=1;j<=n;j++)
        {
            if(!vis[j] && w[k][j]<l[j])
            {
                l[j]=w[k][j];
//              cout<<k<<","<<j<<","<<l[j]<<endl;
                q.push(make_pair(l[j],j));
            }
        }
    }
    cout<<sum<<endl;
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(w,0x3f3f3f3f,sizeof w);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&w[i][j]);
        prim();
    }
}

小根堆

#include<bits/stdc++.h>
//#include <iostream>
//#include <queue> 
using namespace std;
struct Node{
    int x, y;
    Node(int a=0, int b=0):x(a),y(b){}
};
bool operator<(Node a, Node b){//返回true時,說明a的優先級低於b
    //x值較大的Node優先級低(x小的Node排在隊前)
    //x相等時,y大的優先級低(y小的Node排在隊前)
    if( a.x== b.x ) return a.y> b.y;
    return a.x> b.x; 
}
int main(){
    priority_queue<Node> q;
    for( int i= 0; i< 10; ++i )
    q.push( Node( rand(), rand() ) );
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
    return 0;
}

關於stl裏面priority_queue 的各種寫法
https://www.cnblogs.com/Deribs4/p/5657746.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章