【图论】【最小生成树】[IOI2003]maintain
2015-08-26 20:08
656 查看
题目描述:点击此处
解题思路:
在加边的同时对边进行插入排序,当边的数量≥n-1时,进行kruskal,此时每次kruscal的复杂度为O(m),算法的时间复杂度为O(m^2)
实现代码
解题思路:
在加边的同时对边进行插入排序,当边的数量≥n-1时,进行kruskal,此时每次kruscal的复杂度为O(m),算法的时间复杂度为O(m^2)
实现代码
[code]#include<cstdio> #include<cstring> #define INF 0x7f7f7f7f #define MAXN 200 #define MAXM 6000 #include<algorithm> using namespace std; int n,w,fa[MAXN+10],ans; struct node{ int u,v,wt; }edge[MAXM+10]; int find_fa(int x){ if(fa[x]==x) return x; return find_fa(fa[x]); } int kruskal(int ne){ int i,j=0,u,v,ret=0; for(i=1;i<=n;i++) fa[i]=i; for(i=1;i<n;i++){ for(j++;j<=ne;j++){ u=edge[j].u,v=edge[j].v; fa[u]=find_fa(u); fa[v]=find_fa(v); if(fa[u]!=fa[v]){ ret+=edge[j].wt; fa[fa[v]]=fa[u]; break; } } if(j>ne) return -1; } return ret; } int main() { int i,j,k; scanf("%d%d",&n,&w); for(i=1;i<=w;i++){ node t; scanf("%d%d%d",&t.u,&t.v,&t.wt); for(j=1;j<i;j++) if(edge[j].wt>t.wt){ for(k=i;k>j;k--) edge[k]=edge[k-1]; break; } edge[j]=t; if(i<n-1){ puts("-1"); continue; } printf("%d\n",kruskal(i)); } }
相关文章推荐
- [捉虫记录]关于Cascade Training Error的bug
- failure during conversion to COFF: file invalid or corrupt
- 【HDOJ 1021】 Fibonacci Again (矩阵快速幂(裸))
- HDOJ 2674 N!Again(找规律)
- 人工智能进入股市操盘获利巨大激荡股市
- See You Again
- B. Order Book------(Codeforces Round #317 [AimFund Thanks-Round] (Div. 2))
- A. Arrays------(Codeforces Round #317 [AimFund Thanks-Round] (Div. 2))
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) A. Lengthening Sticks 分类
- 1.2句柄及 WinMain函数
- ACdream 1420 High Speed Trains(容斥原理)
- MainActivity,BadgeView
- STL源码剖析 [特殊的空间配置器](机智的type_traits.h)
- http://blog.csdn.net/opennaive/article/details/7514146
- 正确理解wait 和 notify
- Hadoop集群与RAID磁盘阵列
- POJ 2027 No Brainer(水~)
- POJ 1804 Brainman(归并排序)
- ACdream 1420 High Speed Trains(容斥原理+大数)
- Git review :error: unpack failed: error Missing tree