poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

简介:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define N 505
using namespace std;

int g[N][N];
int n, m;
int vis[N], linker[N];
bool dfs(int u){
   for(int i=1; i<=n; ++i)
      if(g[u][i] && !vis[i]){
          vis[i]=1;
          if(!linker[i] || dfs(linker[i])){
              linker[i]=u;
              return true;              
          }
      }
   return false;
}

int main(){
   while(scanf("%d%d", &n, &m) && (n||m)){
       memset(g, 0, sizeof(g));
       while(m--){
          int u, v;
          scanf("%d%d", &u, &v);
          g[u][v]=1;           
       }                    
       for(int k=1; k<=n; ++k)
          for(int i=1; i<=n; ++i)
             for(int j=1; j<=n; ++j)
               if(!g[i][j])
                  g[i][j]=g[i][k]&&g[k][j];
       memset(linker, 0, sizeof(linker));
       int ans=0;
       for(int i=1; i<=n; ++i){
           memset(vis, 0, sizeof(vis));
           if(dfs(i))  ++ans;        
       }
       printf("%d\n", n-ans);
   }
   return 0;    
}

目录
相关文章
|
7月前
|
NoSQL 容器 消息中间件
图、图的遍历及图的拓扑排序
图、图的遍历及图的拓扑排序
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
78 0
|
算法 Java
利用Dijkstra算法求顶点v1到其他各顶点的最短路径Java实现
利用Dijkstra算法求顶点v1到其他各顶点的最短路径Java实现
116 0
利用Dijkstra算法求顶点v1到其他各顶点的最短路径Java实现
|
存储
【每日一题Day61】寻找图中是否存在路径 | BFS 并查集
初始时将source设为已访问,并且将其加入队列。之后每次将队列中的节点出队,并将其能够到达的未访问过的节点入队。如果访问到destination,则直接返回true;如果队列为空,仍未访问到destination,则返回false
115 0
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
|
存储 算法
图的广度优先搜索和深度优先搜索(邻接链表表示)
邻接表表示法将图以邻接表(adjacency lists)的形式存储在计算机中。所谓图的邻接表,也就是图的所有节点的邻接表的集合;而对每个节点,它的邻接表就是它的所有出弧。邻接表表示法就是对图的每个节点,用一个单向链表列出从该节点出发的所有弧,链表中每个单元对应于一条出弧。为了记录弧上的权,链表中每个单元除列出弧的另一个端点外,还可以包含弧上的权等作为数据域。图的整个邻接表可以用一个指针数组表示。例如下图所示,邻接表表示为
226 0
图的广度优先搜索和深度优先搜索(邻接链表表示)
|
算法
图的最短路径—— dijkstra算法
算法的思想如下:规定一个 出发点,然后先初始化距离数组。数组中的每个下标就对应一个结点,每个数据项就是出发点到每个结点的距离。1:将一个集合分为两部分,一个是已经找过的结点U,一个是没有找到过的v2:在距离的数组中,没有访问过的结点中找一个权重最小的边,然后将这个结点添加到u中,并且以这个结点作为中间结点,来更新数组,判断条件是i到temp+temp到j 的距离是不是小于i到j的距离,若是,则就要更新。
1362 0
|
算法
图的最小生成树——Prim算法
Prim算法思想如下:首先将图的点分为两部分,一种是访问过的u,一种是没有访问过的v1:首先在访问过的顶点中找一条到u到v的一条权值最小的边2:然后将这条边中的v中的顶点添加到u中,直到边的个数=顶点数-1如下图所示,下面是prim算法的图示(原图)(a -1)(a -2)(a -3)(a -4) (a -5) (a -6) 算法的流程图如下: 代码如下:// // main.
8019 0
|
算法
图的最小生成树——Kruskal算法
Kruskal算法的思想如下 假设有n个顶点的连通图。首先先构造有顶点构成的集合0,每个顶点都是一个集合,不含有任何边。 在边找一个最小权值的边 判断这个边的俩个顶点是否来自于两个不同的集合,若是就将它俩归并为一个集合,然后将这个边添加到要构成的图的集合中。
5219 0