题意:求连接所有村子的最短路
prim+邻接矩阵
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 #define inf 999999 8 #define N 30 9 int n,dis[N],vis[N],g[N][N]; 10 11 int prim(int root) 12 { 13 for(int i=1; i<=n; i++) 14 dis[i]= g[i][root],vis[i]= 0; 15 dis[root]= 0; 16 vis[root]=1; 17 int cost= 0; 18 for(int T=1; T<=n-1; T++) 19 { 20 int mindis= inf,idx= -1; 21 for(int i=1; i<=n; i++) 22 { 23 if( vis[i]==0 ) 24 { 25 if( mindis>dis[i] ) 26 { 27 mindis= dis[i]; 28 idx= i; 29 } 30 } 31 } 32 cost+=mindis; 33 if( idx==-1 ) return -1; 34 vis[idx]= 1; 35 for(int i=1; i<=n; i++) 36 { 37 if( vis[i]==0 ) 38 { 39 if( dis[i]>g[i][idx] ) 40 dis[i]= g[i][idx]; 41 } 42 } 43 } 44 return cost; 45 } 46 47 int main() 48 { 49 char op1[2],op2[2]; 50 int co,w; 51 while(scanf("%d",&n)&&n) 52 { 53 for(int i=0; i<=N; i++) 54 for(int j=0; j<=N; j++) 55 { 56 if(i==j) g[i][j] = 0; 57 else g[i][j] = inf; 58 } 59 for(int i=1; i<=n-1; i++) 60 { 61 scanf("%s%d",op1,&co); 62 for(int j=1; j<=co; j++) 63 { 64 scanf("%s%d",op2,&w); 65 int u = op1[0]-'A'+1; 66 int v = op2[0]-'A'+1; 67 g[u][v] = g[v][u] = min(g[u][v],w); 68 } 69 } 70 int ans=prim(1); 71 printf("%d\n",ans); 72 } 73 return 0; 74 }
prim+优先队列
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define M 200 9 #define N 30 10 const int inf= 999999; 11 int n,size; 12 typedef pair<int,int>mp; 13 14 int head[N]; 15 int dis[N]; 16 int vis[N]; 17 18 struct Edge 19 { 20 int v,w,next; 21 Edge(){} 22 Edge(int V,int W,int NEXT):v(V),w(W),next(NEXT){} 23 }edge[M]; 24 25 void Init() 26 { 27 memset(head,-1,sizeof(head)); 28 size = 0; 29 } 30 31 void InsertEdge(int u,int v,int w) 32 { 33 edge[size] = Edge(v,w,head[u]); 34 head[u] = size++; 35 edge[size] = Edge(u,w,head[v]); 36 head[v] =size++; 37 } 38 39 int prim(int s) 40 { 41 int cost= 0; 42 int times = 0; 43 for(int i=1; i<=n; i++) 44 { 45 vis[i] = 0; 46 dis[i] = inf; 47 } 48 mp p(0,s); 49 priority_queue< mp,vector<mp>,greater<mp> > Q; 50 Q.push(mp(0,s)); 51 while(!Q.empty()&×<n) 52 { 53 do 54 { 55 p = Q.top(); 56 Q.pop(); 57 }while(vis[p.second]==1&&!Q.empty()); 58 if(vis[p.second]==0) 59 { 60 cost += p.first; 61 vis[p.second] = 1; 62 times ++; 63 for(int i = head[p.second]; i!=-1; i=edge[i].next) 64 { 65 int v = edge[i].v; 66 if(vis[v]==0) 67 { 68 if(edge[i].w < dis[v]) 69 { 70 dis[v] = edge[i].w; 71 Q.push(mp(dis[v],v)); 72 } 73 } 74 } 75 } 76 } 77 if(times<n) 78 return -1; 79 return cost; 80 } 81 int main() 82 { 83 char op1[2],op2[2]; 84 int co,w; 85 while(scanf("%d",&n)&&n) 86 { 87 Init(); 88 for(int i=1; i<=n-1; i++) 89 { 90 scanf("%s%d",op1,&co); 91 for(int j=1; j<=co; j++) 92 { 93 scanf("%s%d",op2,&w); 94 int u = op1[0]-'A'+1; 95 int v = op2[0]-'A'+1; 96 int flag = 0; 97 for(int k=head[u]; k!=-1; k=edge[k].next) 98 {//重边的情况 99 if(v == edge[j].v) 100 { 101 if(w < edge[j].w) 102 edge[j].w = w; 103 flag = 1; 104 break; 105 } 106 } 107 if(flag) continue; 108 InsertEdge(u,v,w); 109 } 110 } 111 int ans=prim(1); 112 printf("%d\n",ans); 113 } 114 return 0; 115 }
kruskal
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 #define N 30 9 #define M 100 10 int n,m,father[N],rank[N],sum; 11 struct Edge 12 { 13 int u; 14 int v; 15 int w; 16 }edge[M]; 17 18 bool cmp(Edge a,Edge b) 19 { 20 return a.w < b.w ; 21 } 22 23 void Init() 24 { 25 for(int i=0; i<=n; i++) 26 { 27 father[i] = i; 28 rank[i] = 1; 29 } 30 } 31 32 int find(int x) 33 { 34 if(father[x] != x) 35 { 36 father[x] = find(father[x]); 37 } 38 return father[x]; 39 } 40 41 void merge(int x,int y) 42 { 43 int xf = find(x); 44 int yf = find(y); 45 if(rank[x] > rank[y]) 46 { 47 rank[xf] += rank[yf]; 48 father[yf] = xf; 49 } 50 else 51 { 52 rank[yf] += rank[xf]; 53 father[xf] = yf; 54 } 55 } 56 57 void Kruskal() 58 { 59 int num = 0; 60 for(int i=0; i<m; i++) 61 { 62 int u = edge[i].u; 63 int v = edge[i].v; 64 if(find(u) != find(v)) 65 { 66 num++; 67 sum += edge[i].w; 68 merge(u,v); 69 } 70 if(num==n-1) break; 71 } 72 } 73 74 int main() 75 { 76 char op1[2],op2[2]; 77 int co,w,cnt; 78 while(scanf("%d",&n)&&n) 79 { 80 Init(); 81 cnt = 0; 82 for(int i=1; i<n; i++) 83 { 84 scanf("%s%d",op1,&co); 85 for(int j=1; j<=co; j++) 86 { 87 scanf("%s%d",op2,&w); 88 int u = op1[0]-'A'+1; 89 int v = op2[0]-'A'+1; 90 edge[cnt].u = u ; edge[cnt].v = v ; edge[cnt].w = w; 91 cnt++; 92 } 93 } 94 m = cnt; 95 sort(edge,edge+m,cmp); 96 sum = 0; 97 Kruskal(); 98 printf("%d\n",sum); 99 } 100 return 0; 101 }
来源:https://www.cnblogs.com/ar940507/p/3223357.html