这个题似曾相识啊,以前是用搜索剪枝+0/1边权bfs做的(题面可以参照上一篇这个题的博客)。

有一类问题就是求 包含若干关键点的最小强联通子图大小是多少。

如果关键点数量是变量,那么就是NP问题了。。。

对于本题来说,关键点数量=2,就可以直接dp啦。

设一个走正向边的点p和一个走逆向边的点q,f[i][j] 即是 p在i且q在j最少经过的点数,转移的话把去的路径伸直然后在纸上画一画,发现总共有三种:

1.i向后扩展一个点

2.j向后扩展一个点

3.i,j通过i到j的最短路径互换位置。

因为状态图并不是dag,所以跑个dij就可以了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=205;
#define pb push_back int n,m,f[N][N],ans,to[N*2];
int ne[N*2],hd[N],num,d[N][N];
bool v[N][N]; struct node{
int x,y;
bool operator <(const node &u)const{
return f[x][y]>f[u.x][u.y];
}
};
priority_queue<node> q; inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;} inline void solve(){
for(int i=1;i<=n;i++) d[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j]; f[1][1]=1; node x;
q.push((node){1,1}); while(!q.empty()){
x=q.top(),q.pop();
// cout<<x.x<<' '<<x.y<<' '<<f[x.x][x.y]<<endl; if(v[x.x][x.y]) continue;
v[x.x][x.y]=1; if(x.x!=x.y&&f[x.x][x.y]+d[x.x][x.y]<=f[x.y][x.x]){
f[x.y][x.x]=f[x.x][x.y]+d[x.x][x.y]-1;
q.push((node){x.y,x.x});
} for(int i=hd[x.x];i;i=ne[i]) if((i&1)&&f[x.x][x.y]+(to[i]!=x.y)<f[to[i]][x.y]){
f[to[i]][x.y]=f[x.x][x.y]+(to[i]!=x.y);
q.push((node){to[i],x.y});
} for(int i=hd[x.y];i;i=ne[i]) if(!(i&1)&&f[x.x][x.y]+(to[i]!=x.x)<f[x.x][to[i]]){
f[x.x][to[i]]=f[x.x][x.y]+(to[i]!=x.x);
q.push((node){x.x,to[i]});
}
} ans=f[2][2]?f[2][2]:-1;
} int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout); memset(d,0x3f,sizeof(d));
memset(f,0x3f,sizeof(f)); scanf("%d%d",&n,&m);
int uu,vv;
for(int i=1;i<=m;i++){
scanf("%d%d",&uu,&vv);
add(uu,vv),add(vv,uu);
d[uu][vv]=1;
} solve(); printf("%d\n",ans);
return 0;
}

  

最新文章

  1. QQ右下角浮动窗口
  2. Codeforces 528D Fuzzy Search(FFT)
  3. node环境配置安装(nvm)
  4. Performance plugin离线安装
  5. 打印从1到最大的n位数
  6. hdu 3590 PP and QQ 博弈论
  7. Java程序内存分析:使用mat工具分析内存占用
  8. C++的XML编程经验――LIBXML2库使用指南[转]
  9. 武汉科技大学ACM:1001: 谁不爱打牌
  10. 转:【创龙TMS320C6748开发板试用】相关软件的安装与基本设置+CCS安装失败分析
  11. 使用Dotfuscator加密混淆程序以及如何脱壳反编译
  12. api大全
  13. springmvc 项目完整示例09 maven项目创建
  14. MySQL数据库优化_limit_1
  15. Nginx系列6:对称加密与非对称加密各自的应用场景
  16. Linux shell逐行读取文件的方法
  17. Ubuntu终端多窗口分屏Terminator
  18. java程序发布成exe等
  19. day03_雷神_文件操作
  20. Linux人工清理内存cache

热门文章

  1. Bazinga(HDU5510+KMP)
  2. hdu1002 A + B Problem II(大数题)
  3. xrange和range的区别
  4. nmap导出处理脚本
  5. ARM中断向量表与响应流程【转】
  6. linux驱动基础系列--Linux mmc sd sdio驱动分析
  7. linux驱动基础系列--Linux下Spi接口Wifi驱动分析
  8. 天气api接口
  9. git命令详情
  10. linux命令(47):rmdir命令