博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1005F Berland and the Shortest Paths
阅读量:5058 次
发布时间:2019-06-12

本文共 1721 字,大约阅读时间需要 5 分钟。

题目描述:给出一个无向图,找出使每个点离1号距离都有最小值时边的k个选择方案。

题解:

先跑bfs求最短路,然后总方案数*=节点a与深度小于a的点相连边数。

最后枚举每个点连哪条边。

代码:

#include
#include
#include
#include
using namespace std;#define N 200050int n,m,k,hed[N],cnt;struct EG{ int to,id,nxt;}e[2*N];void ae(int f,int t,int v){ e[++cnt].to = t; e[cnt].id = v; e[cnt].nxt = hed[f]; hed[f] = cnt;}int dep[N];bool vis[N];void dij(){ memset(dep,0x3f,sizeof(dep)); dep[1]=0; queue
q; q.push(1); vis[1]=1; while(!q.empty()) { int u = q.front(); q.pop(); for(int j=hed[u];j;j=e[j].nxt) { int to = e[j].to; if(!vis[to]) { vis[to]=1; dep[to]=dep[u]+1; q.push(to); } } }}int f[N];int ans[N],sum=1;void dfs(int i){ if(i==n+1) { for(int i=1;i<=m;i++)printf("%d",ans[i]); printf("\n"); sum--; if(!sum)exit(0); } for(int j=hed[i];j;j=e[j].nxt) { int to = e[j].to; if(dep[to]!=dep[i]-1)continue; ans[e[j].id]=1; dfs(i+1); ans[e[j].id]=0; }}int main(){ scanf("%d%d%d",&n,&m,&k); for(int f,t,i=1;i<=m;i++) { scanf("%d%d",&f,&t); ae(f,t,i),ae(t,f,i); } dij(); for(int i=2;i<=n;i++) { int cnt = 0; for(int j=hed[i];j;j=e[j].nxt) { int to = e[j].to; if(dep[to]==dep[i]-1)cnt++; } sum *= cnt; if(sum>=k) { sum=k; break; } } printf("%d\n",sum); dfs(2); return 0;}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/9843036.html

你可能感兴趣的文章
团队项目开发客户端——登录子系统的设计
查看>>
【AppScan心得】IBM Rational AppScan 无法记录登录序列
查看>>
[翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
查看>>
简化通知中心的使用
查看>>
SpringMVC的@Validated校验注解使用方法
查看>>
Python之os模块
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
springmvc进阶
查看>>
[BZOJ4561][JLOI2016]圆的异或并(扫描线)
查看>>
【蓝桥杯】PREV-21 回文数字
查看>>
通过Canvas及File API缩放并上传图片完整演示样例
查看>>
java序列化的机制与原理
查看>>
Intellij IDEA15: 带着参数 运行
查看>>
lua在C/C++中使用table生成对应键及值
查看>>
提取所有汉字
查看>>
公司技术需求备忘录
查看>>
C#发送邮件
查看>>
MySQL系列
查看>>
C++ STL容器之 stack
查看>>
奶牛易物-Alpha版本测试报告
查看>>