描述

南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路。

现在已经知道哪些城市之间可以修路,如果修路,花费是多少。

现在,军师小工已经找到了一种修路的方案,能够使各个城市都联通起来,而且花费最少。

但是,南将军说,这个修路方案所拼成的图案很不吉利,想让小工计算一下是否存在另外一种方案花费和刚才的方案一样,现在你来帮小工写一个程序算一下吧。

 
输入
第一行输入一个整数T(1<T<20),表示测试数据的组数
每组测试数据的第一行是两个整数V,E,(3<V<500,10<E<200000)分别表示城市的个数和城市之间路的条数。数据保证所有的城市都有路相连。
随后的E行,每行有三个数字A B L,表示A号城市与B号城市之间修路花费为L。
输出
对于每组测试数据输出Yes或No(如果存在两种以上的最小花费方案则输出Yes,如果最小花费的方案只有一种,则输出No)
样例输入
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
样例输出
No
Yes
来源
POJ题目改编
上传者
张云聪

题意:次小生成树

WA代码:

 #include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <queue>
using namespace std; #define MAX 200020
#define INF 0x3f3f3f3f struct edge
{
int x,y,cost;
int flag;
}; edge e[MAX];
int f[MAX];
int dis[MAX];
int v,n,m,ans; bool cmp(edge a,edge b)
{
return a.cost<b.cost;
} void init(int n)
{
for(int i=;i<=n;i++)
f[i]=i;
} int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
} void Union(int x,int y)
{
x=find(x);
y=find(y);
f[y]=x;
} int same(int x,int y)
{
return find(x)==find(y);
} int kruskal_1(int n,int m)
{
int ans=;
for(int i=;i<m;i++)
{
if(!same(e[i].x,e[i].y))
{
e[i].flag=;
Union(e[i].x,e[i].y);
ans+=e[i].cost;
}
}
return ans;
} int kruskal_2(int n,int m)
{
int ans=,cnt=;
for(int i=;i<m;i++)
{
if (i == n)//除去这条边之后再求一次最小生成树
continue;
if(!same(e[i].x,e[i].y))
{
Union(e[i].x,e[i].y);
ans+=e[i].cost;
cnt++;
}
}
if(cnt!=n)
return -;
else
return ans;
} int main()
{
int t;
scanf("%d",&t);
while(t--){
init(n);
memset(e,,sizeof(e));
int v=;
scanf("%d%d",&n,&m);
int count;
for(int i=; i<m; i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].cost);
e[i].flag=;
}
sort(e,e+m,cmp);
int flag=,prim_2;
int prim_1=; prim_1=kruskal_1(n,m);
/*for(int i=0; i<m; i++){
cout<<e[i].x<<e[i].y<<e[i].cost<<e[i].flag<<endl;
}*/ for(int i=; i<m; i++){
if(e[i].flag==)
continue;
prim_2=;
init(n);
prim_2=kruskal_2(i,m);
if(prim_2==prim_1){
flag=;
break;
}
} if(prim_1==prim_2){
flag=;
} if(flag)
printf("Yes\n");
else
printf("No\n");
}
}

AC代码:

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int u,v,val;
int flog;
}edge[+];
int pre[],m,n,minn;
void init()
{
for(int i=;i<;i++)
pre[i]=i;
}
int cmp(node s1,node s2)
{
return s1.val<s2.val;
}
int find(int x)
{
return pre[x]==x?x:pre[x]=find(pre[x]);
}
int F(int w)
{
int sum=;
for(int i=;i<m;i++)
{
if(i!=w)
{
int fx=find(edge[i].u);
int fy=find(edge[i].v);
if(fx!=fy)
{
pre[fx]=fy;
sum+=edge[i].val;
}
}
}
int s=find();//判断全部的点是不是已经全部连进去
for(int i=;i<=n;i++)
if(pre[i]!=s)
return -;
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].val),edge[i].flog=;
sort(edge,edge+m,cmp);
minn=;
for(int i=;i<m;i++)//找到最小生成树
{
int fx=find(edge[i].u);
int fy=find(edge[i].v);
if(fx!=fy)
{
pre[fx]=fy;
edge[i].flog=;//标记这条边在最小生成树中已经用过
minn+=edge[i].val;
}
}
int flag=;
for(int i=;i<m;i++)
{
if(edge[i].flog)//每次排除一条边
{
init();
if(F(i)==minn)
{
flag=;
break;
}
}
if(flag) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}

Nyoj 修路方案(次小生成树)的更多相关文章

  1. hdu4081 秦始皇修路(次小生成树)

    题目ID:hdu4081   秦始皇修路 题目链接:点击打开链接 题目大意:给你若干个坐标,每个坐标表示一个城市,每个城市有若干个人,现在要修路,即建一个生成树,然后有一个魔法师可以免费造路(不消耗人 ...

  2. nyoj_118:修路方案(次小生成树)

    题目链接 题意,判断次小生成树与最小生成树的权值和是否相等. 豆丁文档-- A-star和第k短路和次小生成树和Yen和MPS寻路算法 法一: 先求一次最小生成树,将这棵树上的边加入一个向量中,再判断 ...

  3. 修路方案 Kruskal 之 次小生成树

    次小生成树 : Kruskal 是先求出来  最小生成树 , 并且记录下来所用到的的边 , 然后再求每次都 去掉最小生成树中的一个边 , 这样求最小生成树 , 然后看能不能得到 和原来最小生成树一样的 ...

  4. 修路方案(nyoj)

    算法:次小生成树 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. 现在已经知道哪些城市之间可以修路,如果修路,花费是多少. 现在 ...

  5. NYOJ 118 修路方案

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...

  6. nyoj--118--修路方案(次小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  7. nyoj 118 修路方案(最小生成树删边求多个最小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...

  8. hdu4081 次小生成树变形

    pid=4081">http://acm.hdu.edu.cn/showproblem.php?pid=4081 Problem Description During the Warr ...

  9. HDU 4081 Qin Shi Huang's National Road System 次小生成树变种

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

随机推荐

  1. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

  2. 轮播图片 高效图片轮播,两个imageView实现

    该轮播框架的优势: 文件少,代码简洁 不依赖任何其他第三方库,耦合度低 同时支持本地图片及网络图片 可修改分页控件位置,显示或隐藏 自定义分页控件的图片,就是这么个性 自带图片缓存,一次加载,永久使用 ...

  3. Xcode 5.1.1 与 Xcode 6.0.1 共存

    Xcode 5.1.1 (下面简称Xcode5)和Xcode 6.0.1(下面简称Xcode6)都是正式版本号.其应用程序文件名称都是"Xcode".假设通过AppStore升级或 ...

  4. Oracle 闪回表实验

    工:闪回表实验 1.结构测试表flb_test,数据不小于10000行: TEST_USER1@PROD>create table flb_test(id number,dd date); Ta ...

  5. Webx框架:Valve详细解释

    Valve请求,用于控制过程的操作.它采用责任设计模式链(类别似至struts拦截器).valve阀装置,阀控制水流量(网络请求)趋势. 他们阀门定义. public class MyValve im ...

  6. 对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator)

    原文:对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator) 从事移动应用开发,经常会用到模拟器(Simulator)和仿真器(Emulator),本 ...

  7. GitLab一键式安装bitnami

    https://bitnami.com/stack/gitlab/installer https://bitnami.com/redirect/to/96764/bitnami-gitlab-8.5. ...

  8. 【OC加强】辛格尔顿和[NSFileManager defaultMagager]以及其他设计模式

    我们在工作中使用文件NSFileManager上课时间,创建发现1对象,此2同样的对象地址: NSFileManager *file1=[NSFileManager defaultManager]; ...

  9. SVM算法实现(一)

    关键字(keywords):SVM 支持向量机 SMO算法 实现 机器学习 假设对SVM原理不是非常懂的,能够先看一下入门的视频,对帮助理解非常实用的,然后再深入一点能够看看这几篇入门文章,作者写得挺 ...

  10. FreeMarker整合Spring 3(转)

    开发环境: System:Windows WebBrowser:IE6+.Firefox3+ JavaEE Server:tomcat5.0.2.8.tomcat6 IDE:eclipse.MyEcl ...