HDU 6166 Senior Pan
来源:互联网 发布:擂台算法自然语言 编辑:程序博客网 时间:2024/06/05 16:53
HDU 6166 Senior Pan
二进制枚举
题意
给一个有向图,给一个点集,求点集内点的最近距离。
思路
假设最近点对是a,b。那么a,b肯定至少有一个二进制位不同。那么我们按位枚举,只需要枚举20位,肯定又一次枚举可以将a和b分开到两个集合。每次枚举跑一次spfa。取所有的最小值。
链接到cf835E和多猪试毒问题。
代码
不难写
#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<set>#include<iostream>#include<vector>#include<queue>#include<regex>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define M(a,b) memset(a,b,sizeof(a))using namespace std;const int MAXN=100005;const int oo=0x3f3f3f3f;typedef long long LL;struct Edge{ int to, ne, va;}e[MAXN<<1];int head[MAXN], edgenum;void addedge(int u, int v, int c){ e[edgenum].to=v, e[edgenum].va=c, e[edgenum].ne=head[u]; head[u]=edgenum++;}int po[MAXN], mark[MAXN];int dis[MAXN], vis[MAXN];int spfa(int n){ M(dis, 0x3f);M(vis, 0); queue<int> que; for(int i=1;i<=n;i++) { if(mark[i]==1) que.push(i), vis[i]=1, dis[i]=0; } while(!que.empty()) { int u=que.front();que.pop();vis[u]=0; for(int i=head[u];~i;i=e[i].ne) { int v=e[i].to, d=e[i].va; if(dis[u]+d<dis[v]) { dis[v]=dis[u]+d; if(!vis[v]) { que.push(v); vis[v]=1; } } } } int res=0x3f3f3f3f; for(int i=1;i<=n;i++) if(mark[i]==2) res=min(res, dis[i]); return res;}int main(){ /*freopen("in.txt", "r", stdin); freopen("ou.txt", "w", stdout);*/ int T;scanf("%d", &T);int cas=0; while(T--) { int n, m;scanf("%d%d", &n, &m); edgenum=1;M(head, -1); for(int i=1;i<=m;i++) { int u, v, c;scanf("%d%d%d", &u, &v, &c); addedge(u, v, c); } int t;scanf("%d", &t); for(int i=1;i<=t;i++) scanf("%d", &po[i]); int ans=0x3f3f3f3f; for(int i=0;i<20;i++) { M(mark, 0); for(int j=1;j<=t;j++) { if((1<<i)&po[j]) mark[po[j]]=1; else mark[po[j]]=2; } ans=min(ans, spfa(n)); M(mark, 0); for(int j=1;j<=t;j++) { if((1<<i)&po[j]) mark[po[j]]=2; else mark[po[j]]=1; } ans=min(ans, spfa(n)); } printf("Case #%d: %d\n",++cas, ans); } //system("pause"); return 0;}
阅读全文
0 0
- HDU 6166 Senior Pan
- HDU 6166 Senior Pan
- [HDU 6166] Senior Pan
- HDU 6166 Senior Pan
- hdu-6166 Senior Pan
- HDU 6166 Senior Pan
- HDU 6166 Senior Pan
- HDU-6166 Senior Pan
- hdu 6166 Senior Pan 最短路
- hdu 6166 Senior Pan(巧妙的Dijkstra)
- HDU 6166 Senior Pan (2017多校9
- hdu 6166 Senior Pan(最短路)
- [hdu 6166 Senior Pan]Dijkstra+概率随机
- HDU 6166 Senior Pan [二分+SPFA]
- HDU 6166 Senior Pan(SPFA+二进制分组)
- Senior Pan HDU
- Senior Pan HDU
- Hdu 6166 Senior Pan【思维+随机化+最短路】好题~
- HTML5:Getting to Know HTML5
- linux网络编程中INADDR_ANY的含义
- http请求原理(一)
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
- E. Fire in the City Educational Codeforces Round 27 二分+扫描线求面积覆盖+离散化 丧心病狂
- HDU 6166 Senior Pan
- Bochs上运行BIOS启动失败原因分析
- MySQL用SQL开启general_log并设置路径
- python
- 过河
- 数组
- 子元素相对于父元素设定margin-top值的时候
- GO语言学习资源
- python基础入门7--异常