prim+优先队列模板:
1 #include<stdio.h> //大概要这些头文件 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 typedef pair<int,int> pii; 8 9 int head[30],next[200],point[200],val[200],size,dist[30]; //前向星及dist数组 10 bool vis[30]; 11 12 void add (int a,int b, int v){ //加边及去重 13 int i; 14 for(i=head[a];~i;i=next[i]){ 15 if(point[i]==b){ 16 if(val[i]>v)val[i]=v; 17 return; 18 } 19 } 20 point[size]=b; 21 val[size]=v; 22 next[size]=head[a]; 23 head[a]=size++; 24 } 25 26 struct cmp{ //重载小根堆 27 bool operator()(pii a,pii b){ 28 return a.first>b.first; 29 } 30 }; 31 32 void prim(int s){ //prim函数,传入图中一点 33 int i,ans=0; 34 memset(dist,-1,sizeof(dist)); 35 memset(vis,0,sizeof(vis)); 36 priority_queue<pii,vector<pii>,cmp>q; 37 for (i=head[s];~i;i=next[i]){ 38 dist[point[i]]=val[i]; 39 q.push(make_pair(dist[point[i]],point[i])); 40 } 41 dist[s]=0; 42 vis[s]=1; 43 while(!q.empty()){ 44 pii u=q.top(); 45 q.pop(); 46 if(vis[u.second])continue; 47 vis[u.second]=1; 48 ans+=u.first; 49 for(i=head[u.second];~i;i=next[i]){ 50 int j=point[i]; 51 if(!vis[j]&&(dist[j]>val[i]||dist[j]==-1)){ 52 dist[j]=val[i]; 53 q.push(make_pair(dist[j],j)); 54 } 55 } 56 } 57 printf("%d\n",ans); 58 }
时间: 2024-10-10 19:21:58