51nod-1640--天气晴朗的魔法(简单最小生成树)
2017-04-19 22:21
393 查看
1640 天气晴朗的魔法
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=100000+30; 4 const int MAXM=2*MAXN+30; 5 int f[MAXN]; 6 struct edge 7 { 8 int u,v; 9 long long w; 10 }e[MAXM]; 11 int tot; 12 void addedge(int v,int u,int w) 13 { 14 e[tot].v=v; 15 e[tot].u=u; 16 e[tot].w=w; 17 tot++; 18 } 19 int fin(int x) 20 { 21 if(f[x]==-1) 22 return x; 23 else{ 24 f[x]=fin(f[x]); 25 return f[x]; 26 } 27 } 28 bool cmp(edge a,edge b) 29 { 30 return a.w<b.w; 31 } 32 long long kru(int n) 33 { 34 memset(f,-1,sizeof(f)); 35 sort(e,e+tot,cmp); 36 long long num=0,ans=0; 37 int u,v,w; 38 int i; 39 for(i=0;i<tot;i++){ 40 u=e[i].u,v=e[i].v,w=e[i].w; 41 int t1=fin(u); 42 int t2=fin(v); 43 if(t1!=t2){ 44 num++; 45 f[t2]=t1; 46 } 47 if(num==n-1) break; 48 } 49 num=0; 50 memset(f,-1,sizeof(f)); 51 while(e[i].w==e[i+1].w){ 52 i++; 53 } 54 for(;i>=0;i--){ 55 u=e[i].u,v=e[i].v,w=e[i].w; 56 int t1=fin(u); 57 int t2=fin(v); 58 if(t1!=t2){ 59 num++; 60 ans+=w; 61 f[t2]=t1; 62 } 63 if(num==n-1) break; 64 } 65 if(num<n-1) return -1; 66 else return ans; 67 } 68 int main() 69 { 70 //freopen("data.in","r",stdin); 71 int n,m; 72 int a,b; 73 long long v; 74 tot=0; 75 scanf("%d%d",&n,&m); 76 for(int i=0;i<m;i++){ 77 scanf("%d%d%lld",&a,&b,&v); 78 addedge(a,b,v); 79 } 80 //printf("%lld\n",kru(n)); 81 cout<<kru(n)<<endl; 82 } 83View Code
相关文章推荐
- 51nod 1640 天气晴朗的魔法 prime队列+最小生成树+最大生成树+邻接表
- 51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51nod 1640 天气晴朗的魔法(最小生成树)
- 51NOD 1640 天气晴朗的魔法 最小生成树 kuskal
- 51nod 1640 天气晴朗的魔法【最小生成树概念】
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 By Assassin
- 51Nod - 1640 天气晴朗的魔法
- 51nod1640-最小生成树&二分|性质-天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51Nod-1640-天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 克鲁斯卡尔
- 51nod 1640 天气晴朗的魔法(kruskal)
- 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了
- 51nod 1640 天气晴朗的魔法 (图论,并查集)
- 51nod 1640 天气晴朗的魔法