(最小生成树唯一性)POJ 1679 - The Unique MST

题意:

给定一个无向带权图,判断这个图是否有唯一的最小生成树,如果有输出最小生成树,否则输出Not Unique!


 

分析:

模板题,但是对于判断唯一性,有一定的小技巧,先算出整个图的最小生成树,记录这个最小生成树的所有边,然后在整个图中枚举把之前最小生成树删掉一条边,再求最小生成树,一旦出现相同的总权值,就不行了。

然后Kruskal算法反正很快,我发现最小生成树的解决方案往往很暴力,2333。很强


 

代码:

  1 #include <set>
  2 #include <map>
  3 #include <list>
  4 #include <cmath>
  5 #include <queue>
  6 #include <stack>
  7 #include <vector>
  8 #include <bitset>
  9 #include <string>
 10 #include <cctype>
 11 #include <cstdio>
 12 #include <cstring>
 13 #include <cstdlib>
 14 #include <iostream>
 15 #include <algorithm>
 16 // #include <unordered_map>
 17 
 18 using namespace std;
 19 
 20 typedef long long ll;
 21 typedef unsigned long long ull;
 22 typedef pair<int, int> pii;
 23 typedef pair<ull, ull> puu;
 24 
 25 #define inf (0x3f3f3f3f)
 26 #define lnf (0x3f3f3f3f3f3f3f3f)
 27 #define eps (1e-9)
 28 #define fi first
 29 #define se second
 30 
 31 bool sgn(double a, string select, double b) {
 32     if(select == "==")return fabs(a - b) < eps;
 33     if(select == "!=")return fabs(a - b) > eps;
 34     if(select == "<")return a - b < -eps;
 35     if(select == "<=")return a - b < eps;
 36     if(select == ">")return a - b > eps;
 37     if(select == ">=")return a - b > -eps;
 38 }
 39 
 40 
 41 //--------------------------
 42 
 43 const ll mod = 1000000007;
 44 const int maxn = 110;
 45 
 46 
 47 int n,m;
 48 
 49 int par[maxn];
 50 
 51 struct Edge {
 52     int u,v,w;
 53 } edge[maxn*maxn];
 54 
 55 vector<int> mstedge;
 56 
 57 bool cmp(Edge a,Edge b) {
 58     return a.w<b.w;
 59 }
 60 
 61 int findx(int x) {
 62     if(par[x]==x)return x;
 63     else return par[x]=findx(par[x]);
 64 }
 65 
 66 
 67 int Kruskal(int n,int x) {
 68     for(int i=1; i<=n; i++) {
 69         par[i]=i;
 70     }
 71     int cnt=0;
 72     int ans=0;
 73     for(int i=0; i<m; i++) {
 74         if(i==x)continue;
 75         int u = edge[i].u;
 76         int v = edge[i].v;
 77         int w = edge[i].w;
 78         int t1 = findx(u);
 79         int t2 = findx(v);
 80         if(t1!=t2) {
 81             ans+=w;
 82             par[t1]=t2;
 83             cnt++;
 84             if(x==-1)mstedge.push_back(i);
 85         }
 86         if(cnt==n-1)break;
 87     }
 88     if(cnt<n-1)return -1;
 89     else return ans;
 90 }
 91 
 92 void solve() {
 93     int t;
 94     scanf("%d",&t);
 95     while(t--) {
 96         memset(edge,0,sizeof(edge));
 97         mstedge.clear();
 98         scanf("%d%d",&n,&m);
 99         for(int i=0; i<m; i++) {
100             scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
101         }
102         sort(edge,edge+m,cmp);
103         int res = Kruskal(n,-1);
104 //        printf("res=%d\n",res);
105         bool same = false;
106         for(int i=0; i<mstedge.size(); i++) {
107             int rr = Kruskal(n,mstedge[i]);
108 //            printf("rr=%d\n",rr);
109             if(rr==res) {
110                 puts("Not Unique!");
111                 same=true;
112                 break;
113             }
114         }
115         if(!same) {
116             printf("%d\n",res);
117         }
118     }
119 }
120 
121 int main() {
122 
123 #ifndef ONLINE_JUDGE
124     freopen("1.in", "r", stdin);
125     // freopen("1.out", "w", stdout);
126 #endif
127     // iostream::sync_with_stdio(false);
128     solve();
129     return 0;
130 }

 

转载于:https://www.cnblogs.com/tak-fate/p/6665253.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值