POJ 2485 自制prim 模版 复杂度O(ElogE) 优先队列优化
#include <queue> #include <stack> #include <cstdio> #include <cstring> #include <vector> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define MAXN 1000 #define MAXE 1000000 #define INF 0x3f3f3f3f #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) struct Edge{ int u,v,w; // start,end,value int next; }edge[MAXE]; int head[MAXN]; int cnt,n,m; bool vis[MAXN]; int father[MAXN]; bool operator < (Edge a, Edge b){ return a.w > b.w; } void add(Edge x){ // add edge to the list edge[cnt].u = x.u; edge[cnt].v = x.v; edge[cnt].w = x.w; edge[cnt].next = head[x.u]; head[x.u] = cnt++; // edge[cnt].v = x.u; // edge[cnt].u = x.v; // edge[cnt].w = x.w; // edge[cnt].next = head[x.v]; // head[x.v] = cnt++; } int prim(int u){ int ans = -1; priority_queue<Edge> q; vector<int> vec; memset(vis,0,sizeof(vis)); for(int i = head[u]; i != -1; i = edge[i].next) q.push(edge[i]); vec.push_back(u); vis[u] = 1; while(vec.size() != n) { if(vis[q.top().u] && vis[q.top().v]){ q.pop(); continue; } ans += q.top().w; int t = vis[q.top().u] ? q.top().v : q.top().u; q.pop(); vec.push_back(t); vis[t] = 1; for(int i = head[t]; i != -1; i = edge[i].next) if(!vis[edge[i].v]) q.push(edge[i]); } cout<<ans<<endl; } int main(){ //freopen("in.txt","r",stdin); int T; cin>>T; while(T--){ scanf("%d",&n); memset(edge,0,sizeof(edge)); memset(head,-1,sizeof(head)); Edge tmp; cnt = 0; int a; for(int i = 1 ; i <= n; i++ ){ for(int j = 1 ; j <= n ; j++){ scanf("%d",&a); if(a) { tmp.u = i; tmp.v = j; tmp.w = a; add(tmp); } } } prim(1); } return 0; }