【Codeforces666B】【World Tour】【最短路】
2016-07-20 21:08
387 查看
题目大意
给出一幅有向图,求出四个不同的点,两点之间走最短路,用最长的路走完四个点。
解题思路
跑n遍单源最短路,保存每个点最远的三个前驱,最远的三个后继。枚举中间两个点,再枚举它们的前驱和后继,判一下重,取最优答案。
code
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=3000,maxm=5000; int n,m,ans[10],gra[10],to[10][maxm+10],next[10][maxm+10],begin[10][maxn+10],dis[3][maxn+10][maxn+10], f[10][maxn+10][10],queue[maxn+10]; bool inqueue[maxn+10]; void insert(int t,int u,int v){ to[t][++gra[t]]=v; next[t][gra[t]]=begin[t][u]; begin[t][u]=gra[t]; } struct rec{ int pon,dis; friend bool operator<(rec x,rec y){ return (x.dis>y.dis)||((x.dis==y.dis)&&(x.pon<y.pon)); } }; rec a[maxn+10]; void spfa(int t,int now){ int head=0,tail=0,inf=dis[0][0][0]; dis[t][now][now]=0; inqueue[queue[++tail]=now]=1; for(;head!=tail;){ int nown=queue[++head]; inqueue[nown]=0; for(int i=begin[t][nown];i;i=next[t][i]) if(dis[t][now][to[t][i]]>dis[t][now][nown]+1){ dis[t][now][to[t][i]]=dis[t][now][nown]+1; if(!inqueue[to[t][i]])inqueue[queue[++tail]=to[t][i]]=1; } } fo(i,1,n){ a[i].pon=i; a[i].dis=(dis[t][now][i]!=inf)?dis[t][now][i]:-inf; } sort(a+1,a+n+1); fo(i,1,3)f[t][now][i]=a[i].pon; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&m); fo(i,1,m){ int u,v;scanf("%d%d",&u,&v); insert(1,u,v);insert(2,v,u); } memset(dis,63,sizeof(dis)); fo(i,1,n){ spfa(1,i); spfa(2,i); } int inf=dis[0][0][0]; fo(i,1,n) fo(j,1,n) fo(ii,1,3) fo(jj,1,3) if((i!=j)&&(i!=f[2][i][ii])&&(i!=f[1][j][jj]) &&(j!=f[2][i][ii])&&(j!=f[1][j][jj])&&(f[2][i][ii]!=f[1][j][jj]) &&(dis[2][i][f[2][i][ii]]<inf)&&(dis[1][i][j]<inf)&&(dis[1][j][f[1][j][jj]]<inf) &&(ans[0]<dis[2][i][f[2][i][ii]]+dis[1][i][j]+dis[1][j][f[1][j][jj]])){ ans[0]=max(ans[0],dis[2][i][f[2][i][ii]]+dis[1][i][j]+dis[1][j][f[1][j][jj]]); ans[1]=f[2][i][ii];ans[2]=i;ans[3]=j;ans[4]=f[1][j][jj]; } printf("%d %d %d %d",ans[1],ans[2],ans[3],ans[4]); return 0; }
相关文章推荐
- 字符串最后一个单词的长度
- 关于java 中的继承问题
- BZOJ 3685 普通van Emde Boas树
- CentOS7代理设置
- 求最大网络流(最小割)总结
- 面试题45:圆圈中最后剩下的数字
- [置顶] 安卓中滑动事件的传递机制及dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent的调用
- OGR示例:写shp,求面与面的交和差操作
- CodeIgniter框架将数据库查询结果导出为.csv或.cvs或excel文档
- IOS警告:Property access result unused - getters should not be used for side effects
- 【幻化万千戏红尘】qianfengDay08-java基础学习:修饰符、重写、继承、抽象、递归、final
- 求平均成绩 hd 2023
- DataGridView如何快速导出Excel
- codeforces水题100道 第二十三题 Codeforces Beta Round #77 (Div. 2 Only) A. Football (strings)
- Android 仿联系人字母索引
- Windows批处理(cmd/bat)常用命令小结
- socket是什么意思
- 《React-Native系列》5、RN实现弹出选择界面与动画效果
- 树莓派2(使用rtl8188cu网卡)+openwrt 15.05+mentohust做个校园网路由器
- 使用pg_buffercache查看缓存区缓存