poj1861 - Network
2012-08-17 10:10
316 查看
想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个顶点,m条边,每条边双向的,并且有一定的长度,现在要求使每个顶点连通起来,并且使总长度最短输出最大边,和边的总数,还有是这些边的情况输出
解题思路:一个裸的kruskal,注意的是他的测试用例有错误,应该是
1
3
1 3
2 3
2 4
边输出的情况可以不同,因为是特殊判题
/* kruskal Memory 372K Time 79MS */ #include <iostream> #include <queue> using namespace std; #define MAXM 15010 #define MAXV 1010 typedef struct{ int s,t,w; }Edge; int n,m,set[MAXV]; Edge edge[MAXM]; int find(int x){ int rt; if(set[x]!=x){ rt=find(set[x]); set[x]=rt; return set[x]; }else return x; } bool Union(int a,int b){ int fa,fb; fa=find(a); fb=find(b); if(fa==fb) return 0; set[fa]=fb; return 1; } void kruskal(){ queue <int>q; int i,ans=-1,cnt=0; for(i=1;i<=m;i++){ if(Union(edge[i].s,edge[i].t)){ if(ans<edge[i].w) ans=edge[i].w; q.push(i); if((++cnt)==(n-1)) break; //已经找到n-1条边了 } } printf("%d\n",ans); printf("%d\n",q.size()); while(!q.empty()){ i=q.front();q.pop(); printf("%d %d\n",edge[i].s,edge[i].t); } } int cmp(const void * a,const void *b){ return (*(Edge*)a).w-(*(Edge*)b).w; } int main(){ int i; while(~scanf("%d%d",&n,&m)){ for(i=0;i<=n;i++) set[i]=i; for(i=1;i<=m;i++){ scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w); } qsort(edge+1,m,sizeof(edge[0]),cmp); kruskal(); } return 0; }
相关文章推荐
- poj 1861 Network(最小生成树)
- (kruscal12.3.1)POJ 1861 Network(求最小生成树的最大边&&并且输出各边的信息)
- POJ 1861 Network (Kruskal算法)
- POJ 1861 Network 并查集和krusral算法
- POJ 1861 Network
- POJ1861 Network
- pojn 1861 Network(Kruskal)
- POJ1861——Network
- POJ 1861--Network
- POJ-1861-Network 解题报告
- POJ 1861 && ZOJ 1542--Network 【最小生成树 && kruscal && 水题】
- POJ 1861 Network ---最小生成树
- POJ 1861 Network(MST)
- POJ1861 Network
- POJ 1861 Network (Kruskal+并查集)
- poj 1861 Network
- ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法
- poj 1861 Network
- POJ 1861 NetWork (Kruskal算法)
- POJ 1861 Network