POJ2377最大路径问题

来源:互联网 发布:dbc文件解析软件 编辑:程序博客网 时间:2024/05/30 02:25
///修网络有个N个顶点,其中有M跳路径每条的代价为C求出其中的最大路径数

//思路:明显最小生成树的相反情况用kruskal算法


//384K47MS#include <iostream>#include <algorithm>using namespace std;#define  MAX_E 20005#define  MAX_N 3000namespace{int rank[MAX_N];int par[MAX_N];//父亲//初始化n个元素void init_union_find(int n){for (int i=0;i<n;++i){rank[i] = 0;par[i] = i;}}//查询树的根int find_root(int x){if (par[x]==x)  return x;else{return par[x] = find_root(par[x]);}}//合并x和y所属的集合void unite(int x,int y){x = find_root(x);y = find_root(y);    if (x==y)      return;if (rank[x]<rank[y])  par[x] = y;else{par[y] = x;if (rank[x]==rank[y])  rank[x]++;}}//判断x和y是否属于一个集合bool same(int x,int y){return find_root(x)==find_root(y);}}struct net_edge{int u,v,cost;net_edge(int b,int d,int c):u(b),v(d),cost(c){}net_edge(){}};net_edge edg[MAX_E];static int V,E;int comp(const net_edge&e1,const net_edge&e2){return e1.cost>e2.cost;}int kruskal(){sort(edg,edg+E,comp);//边排序init_union_find(V);int res = 0;for (int i=0;i<E;++i){net_edge e = edg[i];if (!same(e.u,e.v)){unite(e.u,e.v);res+=e.cost;}}return res;}bool check_root(){int root = find_root(0);bool ok = true;for (int i=1;i<V;i++){if (find_root(i)!=root){ok = false;break;}}return ok;}int main(){scanf("%d %d",&V,&E);for (int i=0;i<E;++i){int src,dest,cost;scanf("%d %d %d",&src,&dest,&cost);edg[i] = net_edge(src-1,dest-1,cost);}int ret = kruskal();if (check_root()){printf("%d\n",ret);}elseprintf("-1\n");return 0;}


0 0
原创粉丝点击