POJ 1130(一道纯水,bfs+dfs)

POJ 1130

大概题意:给出一副图,求从起点到终点 (0->ET) 必须经过的一点。

我的思路:首先DFS求出经过每点的次数,必过的一点的次数一定最高,但是就这样吗?有可能有多个必过的点,所以还要找出离ET最近的点,这里就利用BFS逐层搜索的性质求每点到ET的距离。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<iomanip>
#include<queue>
#include<algorithm>
#define INF 0x3fffffff
using namespace std;
const int N=20;

int n,m;
int graph[N][N];
int vis[N];
int time[N];
int dis[N];

struct node{
    int p;
    int time;
    int dis;
}condi[N];

int cmp(node a,node b)
{
    if(a.time==b.time)
        return a.dis<b.dis;
    return a.time>b.time;
}

int dfs(int cur)
{
    int ok=0;
    if(cur==0)
    {
        condi[0].time++;
        return 1;
    }
    for(int i=0;i<n;i++)
    {
        if(!vis[i]&&graph[cur][i])
        {
            vis[i]=1;
            ok+=dfs(i);
            vis[i]=0;
        }
    }
    condi[cur].time+=ok;
    return ok;
}

void bfs(int cur)
{
    memset(vis,0,sizeof vis);
    condi[cur].dis=0;
    queue<int> q;
    q.push(cur);
    vis[cur]=1;
    while(!q.empty())
    {
        int pos=q.front();
        q.pop();
        for(int i=0;i<n;i++)
        {
            if(graph[pos][i]&&!vis[i])
            {
                vis[i]=1;
                condi[i].dis=condi[pos].dis+1;
                q.push(i);
            }
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    int u,v;
    memset(graph,0,sizeof graph);
    memset(vis,0,sizeof vis);
    for(int i=0;i<n;i++)
    {
        condi[i].dis=INF;
        condi[i].time=0;
        condi[i].p=i;
    }
    while(scanf("%d%d",&u,&v)!=EOF)
    {
        graph[v][u]=1;
    }
    vis[m]=1;
    dfs(m);
    bfs(m);
    condi[m].dis=INF;
    sort(condi,condi+n,cmp);
    printf("Put guards in room %d.\n",condi[0].p);

    return 0;
}

POJ 1130(一道纯水,bfs+dfs)

时间: 2024-11-08 20:07:18

POJ 1130(一道纯水,bfs+dfs)的相关文章

poj 2688 cleaning robot(bfs+dfs)

Description Here, we want to solve path planning for a mobile robot cleaning a rectangular room floor with furniture. Consider the room floor paved with square tiles whose size fits the cleaning robot (1 * 1). There are 'clean tiles' and 'dirty tiles

POj 1753--Flip Game--位运算+BFS

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30669   Accepted: 13345 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the

POJ 1856 Sea Battle(BFS).

~~~~ 题意: 给你一个R*C的图,求其由图中连通'#"所组成的矩形的个数. 注意:If the ships were placed correctly (i.e., there are only rectangles that do not touch each other even with a corner), print the sentence "There are S ships." where S is the number of ships. Otherwi

BFS/DFS算法介绍与实现(转)

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比如:Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.BFS的思想:从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.--Vn,然后依次访问与V1.V2--Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图.由此

邻结矩阵的建立和 BFS,DFS;;

邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!---------------------------------------------------------------------------------------------------------------------------------------//邻接矩阵的建立和 其BFS, DFS, 遍历 #include <

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

POJ 1564 Sum It Up (DFS+剪枝)

 Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5820   Accepted: 2970 Description Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t = 4

建图方式一 之 ”前向星“ BFS&amp;&amp;DFS 简单应用

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include