次小生成树(poj2831)
来源:互联网 发布:三凌plc编程软件下载 编辑:程序博客网 时间:2024/05/21 11:19
题目大意:给你一幅图,接下来是q个询问。每个询问的形式为:
id c
表示询问把第id条边的长度改为c后,这条边是否存在于整个图的最小生成树中。
做法:次小生成树。若用prim变形,记录一个数组mx[u][v] 表示在最小生成树中,连接u,v的路径中最长的一条边的长度。比较第id条边连接的u,v的mx[u][v] 。若c≤mx[u][v] ,则答案为Yes,否则为No。
#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int maxn=1010;const int INF=0x3f3f3f3f;int g[maxn][maxn],mx[maxn][maxn];int x[maxn*100],y[maxn*100];int vis[maxn],pre[maxn],dis[maxn];int n,m,k;int e;void prim(){ memset(vis,0,sizeof(vis)); int i,j,k=1; for(i=2;i<=n+1;i++) dis[i]=INF; int _min; for(i=1;i<=n;i++){ _min=INF; for(j=1;j<=n;j++){ if(!vis[j] && dis[j]<_min){ k=j; _min=dis[j]; } } for(j=1;j<=n;j++){ if(vis[j]){ mx[k][j]=max(mx[j][pre[k]],dis[k]); mx[j][k]=mx[k][j]; } } vis[k]=1; for(j=1;j<=n;j++){ if(!vis[j] && dis[j]>g[k][j]){ dis[j]=g[k][j]; pre[j]=k; } } }}int main(){ scanf("%d%d%d",&n,&m,&k); memset(g,INF,sizeof(g)); e=0; int i,j; for(i=1;i<=n;i++) g[i][i]=0; for(i=1;i<=m;i++){ int w; scanf("%d%d%d",&x[i],&y[i],&w); g[x[i]][y[i]]=g[y[i]][x[i]]=min(g[x[i]][y[i]],w); } prim(); while(k--){ int a,b; scanf("%d%d",&a,&b); if(mx[x[a]][y[a]]<b) printf("No\n"); else printf("Yes\n"); } return 0;}
^_^
1 0
- 次小生成树(poj2831)
- Poj2831 树链剖分||次小生成树
- POJ2831 Can We Build This One?(次小生成树)
- 一道生成树问题 poj2831
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- 次小生成树
- Android----菜单的使用
- ListView的优化
- 不能既添加又删除某属性;如果某元素有了该属性(例如动画);再添加并不会再次执行该属性(动画)
- Python 强行utf-8解码
- TCP四种计时器
- 次小生成树(poj2831)
- c语言回环树实现
- 周记<From 2016/9/1 to 2016/9/7>
- join()练习
- mock接口冒烟用例测试是,如果有2个返回参数,需要做如下配置
- 给自己的公信
- 求蛇形矩阵
- POJ刷题指南 //纪念g20期间死去的HDOJ
- Android入门开发之中级组件