標籤:stream 意思 blog one art ems cst include start
題目大意:
求最小產生樹。輸入一個n,k。n表示有n個點,接下來k行,每行輸入三個數字a,b,c,意思是:ab之間的距離為c。n=0時結束輸入。
n<=50,K<=100
解題思路:
套模板。注意可能有重複的路徑。比如 1 2 6 ,2 1 8。此時就要取 1 2 6。
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #include <stack> 7 #include <algorithm> 8 #include <set> 9 10 #include <cstdio>11 #include <cstring>12 #include <cmath>13 #include <cstdlib>14 using namespace std;15 16 const int INF=0x3f3f3f3f;17 const int SIZE=100; ///不是很懂要開多大 就開的大一點了18 19 int id[SIZE];20 int sz[SIZE];21 int m,n;22 23 struct node{24 int start;25 int end;26 int val;27 28 }edge[10000]; ///emmmm29 void clear()30 {31 for(int i=0;i<=n;i++)32 {33 id[i]=i;sz[i]=1;34 }35 }36 int find(int x)37 {38 if(x!=id[x]) id[x]=find(id[x]);39 return id[x];40 }41 42 void un(int p,int q)43 {44 p=find(p);45 q=find(q);46 if(p==q) return ;47 if(sz[p]<sz[q])48 id[p]=find(q);49 else50 {51 if(sz[p]==sz[q])52 sz[p]++;53 id[q]=find(p);54 }55 }56 57 int kruskal()58 {59 int sum=0;60 for(int i=0;i<m;i++)61 {62 if(find(edge[i].start)!=find(edge[i].end))63 {64 un(edge[i].start,edge[i].end);65 sum+=edge[i].val;66 }67 }68 return sum;69 70 }71 72 bool cmp(node a,node b)73 {74 return a.val<b.val;75 }76 int main()77 {78 while(cin>>n)79 {80 if(n==0) break;81 cin>>m;82 clear();83 int a,b,value;84 for(int i=0;i<m;i++)85 {86 cin>>a>>b>>value;87 edge[i].start=a;88 edge[i].end=b;89 edge[i].val=value;90 }91 sort(edge,edge+m,cmp);92 cout<<kruskal()<<endl;93 }94 return 0;95 }
Kruskal 演算法
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #include <stack> 7 #include <set> 8 9 #include <cstdio>10 #include <cstring>11 #include <cmath>12 #include <cstdlib>13 using namespace std;14 15 const int INF=0x3f3f3f3f;16 const int SIZE=100;17 18 int dis[SIZE];19 int graph[SIZE][SIZE];20 int n,m;21 int vis[SIZE];22 23 int prim()24 {25 memset(vis,0,sizeof(vis));26 int index;27 int sum=0;28 for(int i=1;i<=n;i++) ///起點是129 dis[i]=graph[i][1];30 vis[1]=1;31 for(int i=2;i<=n;i++)32 {33 int minn=INF;34 for(int j=1;j<=n;j++)35 if(!vis[j]&&dis[j]<minn)36 {37 minn=dis[j];index=j;38 }39 vis[index]=1;40 sum+=minn;41 for(int j=1;j<=n;j++)42 if(dis[j]>graph[j][index]&&!vis[j])43 dis[j]=graph[j][index];44 }45 return sum;46 }47 int main()48 {49 while(cin>>n)50 {51 if(n==0) break;52 cin>>m;53 memset(graph,INF,sizeof(graph));54 int a,b,value;55 for(int i=0;i<m;i++)56 {57 cin>>a>>b>>value;58 if(graph[a][b]>value) ///注意重複就好59 graph[a][b]=graph[b][a]=value;60 }61 cout<<prim()<<endl;62 }63 return 0;64 }
Prim 演算法
B - Networking POJ - 1287