https://vjudge.net/problem/Kattis-planestrainsbutnotautomobiles

题意:给一个有向图,火车可以由任意一个起点开始,每一个点只能经过一次,在坐火车的时候你可以选择坐飞机到另外一个点,求坐飞机的最小次数,以及求出可能在哪里坐飞机和降落。

样例:

思路:求坐飞机次数 就是裸的最小路径覆盖,然后bfs求出可能的起点和终点。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#include <list>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define sc second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<ll,ll> pii;
int dx[8]= {-1,1,0,0,1,1,-1,-1},dy[8]= {0,0,1,-1,-1,1,-1,1};
const ll mod=998244353;
const ll N =2e5+10;
const ll M =250000;
const double eps = 1e-4;
//const double pi=acos(-1);
ll re(){ll x;scanf("%lld",&x);return x;}
ll qk(ll a,ll b){ll ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b/=2;}return ans;}
inline int read(){int sgn = 1; int sum = 0;char ch = getchar();while (ch < '0' || ch > '9') {if(ch == '-')   sgn = -sgn;ch = getchar();}while ('0' <= ch && ch <= '9') {sum = sum*10+(ch-'0');ch = getchar();}return sgn*sum;}ll n,m;
vector<int> g[N];
vector<int> a;
int match[N];
int vis[N];
int vis1[N];
bool dfs(int x){for(int i:g[x]){if(!vis1[i]){vis1[i]=1;if(!match[i]||dfs(match[i])){match[x]=i;match[i]=x;return 1;}}}return 0;
}
void bfs(){FILL(vis,0);queue<int> q;for(int i=1;i<=n;i++){if(!match[i]) q.push(i);}while(!q.empty()){int u=q.front();q.pop();if(vis[u]) continue;vis[u]=1;a.pb(u);for(int v:g[u]){if(v!=match[u]&&match[v]){q.push(match[v]);}}}for(int i=n+1;i<=2*n;i++){if(!match[i]) q.push(i);}while(!q.empty()){int u=q.front();q.pop();if(vis[u]) continue;vis[u]=1;a.pb(u-n);//cout<<u-n<<endl;for(int v:g[u]){if(v!=match[u]&&match[v]){q.push(match[v]);}}}sort(all(a));a.erase(unique(all(a)),a.end());
}
void sovle(){n=re(),m=re();for(int i=1;i<=m;i++){int u=re(),v=re();g[u].pb(v+n);g[v+n].pb(u);}ll ans=0;for(int i=1;i<=n;i++){FILL(vis1,0);if(dfs(i)) ans++;}bfs();cout<<n-ans-1<<endl;if(n-ans-1!=0)for(int i:a) cout<<i<<" ";
}int main()
{iosint t=1;while(t--){sovle();}return 0;
}

Planes, Trains, but not Automobiles-求最小路径覆盖的起点终点相关推荐

  1. 有向图最小路径覆盖方法浅析、证明 //hdu 3861

    路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...

  2. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  3. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)

    C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...

  4. POJ 2594 Treasure Exploration (可相交最小路径覆盖)

    题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...

  5. UVALive - 3126 Taxi Cab Scheme(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:有n个人要坐出租车,每个人上车的时间已知,规定出租车必须在每个人上车之前的一分钟之前到达这个人的位置,之后给出每个人的当前坐标以及需要达到的目的地坐标,行驶完该段路程的时 ...

  6. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问 ...

  7. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

    <题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...

  8. poj 2594 Treasure Exploration 最小路径覆盖

    题目链接:http://poj.org/problem?id=2594 建图很重要!!! 大致题意: 给出一个由n个顶点m条边组成的有向无环图.求最少可以同时存在多少路径,使得这些路径可以覆盖所有的点 ...

  9. 最小路径覆盖问题求解及与最小边覆盖的区别

    最小边覆盖: 边覆盖集:通俗地讲,所谓边覆盖集,就是G中所有的顶点都是E*中某条边的邻接顶点(边覆盖顶点),一条边只能覆盖2个顶点. 注意:在无向图中存在用尽量少的边去"覆盖"住所 ...

最新文章

  1. window下运行linux程序
  2. 广东省工业和信息化厅关于印发广东省 5G 基站和数据中心总体布局规划 (2021-2025 年)的通知...
  3. linux 1080ti显卡黑屏,Ubuntu 17.04+GTX1080Ti 安装辛酸之路
  4. 中班科学计算机,幼儿园中班科学课件:《照镜子》
  5. LwIP 之六 详解动态内存管理 内存池(memp.c/h)
  6. [原创]android使用代码生成LayerDrawable的方法和注意事项
  7. mysql linux导入csv主键,MySQL导入csv文件内容到Table及数据库的自增主键设置
  8. ciaodvd数据集的简单介绍_COCO数据集的简单介绍
  9. Python实战之Selenium自动化测试web刷新FW
  10. 关于shopex友情链接的添加以及首页调用问题
  11. 将bat文件转化成exe
  12. 三插头内部结构图_三孔插座内部结构
  13. Python工程师是做什么的?如何学习Python
  14. 死锁的处理-避免死锁
  15. 兔子繁殖问题。假设有一对小兔子,一个月后成长为一对大兔子,从 第二个月开始,每对大兔子生一对小兔子。不考虑兔子的死亡,求第n个月的兔子总对数
  16. 新生宝宝奶粉喂养正确方法
  17. 竞斗云2.0刷机-编程器刷入opboot
  18. 【附源码】计算机毕业设计SSM时事新闻管理系统
  19. eclipse中向svn提交代码冲突的解决
  20. Python中graphics不存在,解决办法

热门文章

  1. python开源考试_Github 上 10 个值得学习的 Springboot 开源项目
  2. 真正的男人要勇于承担责任......
  3. 要成为年薪五十万的数据分析师,除了技术还需要什么?
  4. redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建
  5. 海外服务器搭建网站访问很慢,海外服务器访问速度变慢了怎么办
  6. 2021年度最全面JVM虚拟机,类加载过程与类加载器
  7. java注解 sql_mybatis中注解映射SQL示例代码
  8. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程
  9. python http协议获取对方的ip地址_http协议(一)基础知识
  10. java读取文件跳过_在Java中读取文本文件-为什么跳过行?