poj 1251 最小生成树基础

题目:点击打开链接

题意:


分析:

就是给一个图,求最小生成树。


prime算法:

#include 
#include
#include
#include
#include
#include
using namespace std;
const int N=50;
int g[N][N],dis[N];
char op[2];
int n;
bool vis[N];
int prim(int src)
{
    for(int i=0;ig[p][j])dis[j]=g[p][j];
        }
    }
    return res;
}
int main()
{

    while(~scanf("%d",&n)&&n){
        int num,w;
        memset(g,0x3f,sizeof(g));
        for(int i=1;i

priority_queue优化的prime算法,但是数据有点弱,跟上面都是0ms,没太大区别。

我觉得,这种方法之于prime,就像spfa之于dijkstra,思想都是一致的,只是实现不同而已。

#include 
#include
#include
#include
#include
#include
using namespace std;
const int N=50;
#define MP(x,y) make_pair(x,y)
typedef pairpii;
vectore[N];
bool vis[30];
int dis[30];
int n;
int prim(int src)
{
    priority_queue,greater >q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    int res=0;
    dis[src]=0;
    q.push(MP(0,src));
    while(!q.empty()){
        pii t=q.top();
        q.pop();
        int u=t.second;
        if(!vis[u]){
            vis[u]=1;
            res+=dis[u];
            for(int i=0;iw){
                    dis[v]=w;
                    q.push(MP(w,v));
                }
            }
        }
    }
    return res;
}
int main()
{
   // freopen("f.txt","r",stdin);
    char op[2];
    while(~scanf("%d",&n)&&n){
        int num,w;
        for(int i=0;i

Kruskal算法:

#include 
#include
#include
#include
#include
#include
using namespace std;
const int N=50;
struct edge
{
    int u,v,w;
    edge(){}
    edge(int u,int v,int w):u(u),v(v),w(w){}
    bool operator < (const edge &a)const{
        return w




你可能感兴趣的:(最小生成树)