2011.07.14

来源:互联网 发布:全知之眼的意义 编辑:程序博客网 时间:2024/05/01 00:50

Prim+优先队列 模板:

#include<fstream>#include<cstring>#include<algorithm>#include<queue>#define MAXE 10000#define MAXV 150using namespace std;const long long INF=(long long)1<<63-1;typedef pair<long long,long long> pii;long long t,m,n,V,E,pos=0,head[MAXV];long long ans,d[MAXV];struct Edge{    long long w,next,v;}node[MAXE*2];//无向图邻接表void add(long long u,long long v,long long w){    if(u==v) return;                  //如果指向自己的边则舍去    node[pos].v=v;    node[pos].w=w;    node[pos].next=head[u];    head[u]=pos++;}//S为起点标号void prim(long long b){    bool done[MAXV];    memset(done,0,sizeof(done));    priority_queue<pii,vector<pii>,greater<pii> > q;    q.push(make_pair(d[b],b));    while(!q.empty()){        pii u=q.top();q.pop();        long long x=u.second;        done[x]=true;        for(long long i=head[x];i!=-1;i=node[i].next)       //松弛操作            if(!done[node[i].v] && d[node[i].v]>node[i].w){                d[node[i].v]=node[i].w;                q.push(make_pair(d[node[i].v],node[i].v));            }    }}ifstream cin("in");ofstream cout("out");int main(){    long long t,g[MAXV][MAXV];    while(cin>>V){        pos=1;        memset(head,-1,sizeof(head));        for(long long i=1;i<=V;i++)for(long long j=1;j<=V;j++){            cin>>g[i][j];            add(i,j,g[i][j]);        }        for(long long i=1;i<=V;i++) d[i]=INF;        d[1]=0;        prim(1);        for(long long i=1;i<=V;i++)            ans+=d[i];        cout<<ans<<endl;        ans=0;    }    return 0;}




原创粉丝点击