zoj 2677 最大生成树
来源:互联网 发布:视频转换器 for mac 编辑:程序博客网 时间:2024/05/20 20:04
今天做武大的网上的比赛,前二十分钟交了一题,后二十分钟交了一题,无语了!!!
比赛时I题做出来的人好多,而我却一直没有看懂题意,然后是大数,要用java所以也就没有详细的去研究,还有这题,本来 是生成书的,但是一开是就只想到了费用流,然后什么想法,然后就看了两个最不值得看的题,其实那两道题没什么思路,但是却一直在研究,因为题意好懂,结果花了几乎四个小时去研究那个了,然后是没什么进展,思路连样例都过不去的,最后不到一个小时,看到B题过的人很多,然后就又去仔细研究B题,其实B题刚开始也看了下,都没有看懂题,然后这次看懂题了,就是很基础的线段树,然后就很后悔啊,应该先做这个的。。。结果用cout然后tle了一次。。。真的对自己无语了,不过还好的是整个比赛的时候状态挺好的,没有什么低落的时候!好了,扯到这题上!
题目大意:对于n个点以及m条连接这些点的路,摧毁每条路需要一定的话费,求在给定的花费下摧毁的路最多数,但是要求各个点还必须是连通的!
思路:因为摧毁到最后这个图还必须是一个树,所以可以先考虑建树,然后对于那些多余的边进行摧毁,因为要摧毁的边最多,所以要建立最大生成树,由于这个题中点比较多,而且主要针对边进行的操作,所以可以选用克鲁斯卡尔算法!下面是代码:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>#include<map>using namespace std;#define rep(i,n) for(int i=0; i<n; i++)#define repf(i,n,m) for(int i=(n); i<=(m); ++i)#define repd(i,n,m) for(int i=(n); i>=(m); --i) #define ll long long#define arc(a) ((a)*(a))#define inf 100000#define exp 0.000001#define N 100010 int pre[50010];bool vis[50010];struct node{int x,y,l,i;bool vis;};node a[N];int n,m;ll money;bool cmp(const node x,const node y){if(x.l==y.l)return x.i>y.i;return x.l>y.l;}int find(int x){ while(pre[x]!=x) x=pre[x];return x;}bool cmp2(const node x,const node y){if(x.vis==y.vis)return x.l<y.l;return x.vis<y.vis;}int main(){int rr=0; while(scanf("%d%d",&n,&m)!=EOF) { cin>>money; if(rr!=0) printf("\n"); rr=1; memset(pre,0,sizeof(pre)); memset(vis,false,sizeof(vis)); repf(i,1,m) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].l),a[i].i=i,a[i].vis=false; sort(a+1,a+m+1,cmp); int k=0; repf(i,1,m) { int x=a[i].x,y=a[i].y; if(vis[x]==false && vis[y]==false) { vis[x]=true; vis[y]=true; pre[x]=y; pre[y]=y; a[i].vis=true; k++; } else if(vis[x]==true && vis[y]==false) { vis[y]=true; pre[y]=x; a[i].vis=true; k++; } else if(vis[x]==false && vis[y]==true) { vis[x]=true; pre[x]=y; a[i].vis=true; k++; } else if(find(x)!=find(y)) { pre[find(x)]=find(y); a[i].vis=true; k++; }// cout<<k<<endl; if(k==n-1) break; } sort(a+1,a+m+1,cmp2);// rep(i,m)// cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].l<<" "<<a[i].vis<<endl; k=0; vector<int>q; repf(i,1,m) { if(a[i].vis==true) break; if(a[i].l>money) break; q.push_back(a[i].i); k++; money-=a[i].l; } printf("%d\n",k); rep(i,q.size()) { if(i!=0) printf(" "); printf("%d",q[i]); } printf("\n"); } return 0;}
- zoj 2677 最大生成树
- ZOJ 2677 H.Oil Deal MST 最大生成树
- ZOJ 3649 Social Net 最大生成树 + 并查集维护
- zoj 1677 Oil Deal 最大生成树 Andrew Stankevich's Contest #8(H)
- zoj 1406 最小生成树
- ZOJ 1203 最小生成树
- zoj 1258 最小生成树
- ZOJ 1586(最小生成树)
- 最大生成树
- poj1797最大生成树
- hdu3367(最大生成树)
- poj1797最大生成树
- poj3273 最大生成树
- 最大生成树
- POJ2377(最大生成树)
- poj3723(最大生成树)
- 最大生成树Kruskal
- Aizu2224 最大生成树??
- 《C Primer Plus》第12章之类型限定词restrict用法
- HDU4353(找一个三角形面积与它里面包含点的比值最小)
- Codeforces Round #191 (Div. 2) C magic five
- 三分求最小值——HDU 2241
- 如何防止自己的电脑成为肉鸡?
- zoj 2677 最大生成树
- 注释,连接字符串,nvl函数,linesize,pagesize
- Git常用命令和场景(四)--设置忽略提交的文件类型
- 数据挖掘导论
- VS2008快捷键大全
- 黑马程序员--final关键字特点
- 一些概念
- C#中多态理解
- 可变长参数列表va_arg