zoj 3583 simple path

原创 2012年03月30日 17:51:26

Simple Path

Time Limit: 2 Seconds      Memory Limit: 65536 KB

A path with no repeated vertices of an undirected graph is called a simple path. Given an undirected graph and two verteices S and D, return the number of vertics which don't lie on any simple paths between S and D.

Input

The input contains multiple test cases.

Each case starts with a line of four integers, N(1 < N ≤ 100), M(1 ≤ M ≤ N(N - 1) / 2), S(0 ≤ S < N), D(0 ≤ D < N). N is the number of vertices, M is the number of edges, S and D are two different vertices. Then M lines follow, each line contains two different integers A(0 ≤ A < N) and B(0 ≤ B < N), which represents an edge of the graph. It's ensure that there is at least one simple path between S and D.

Output

Output the number of such vertics, one line per case.

Sample Input

4 3 0 2
0 1
1 2
1 3
4 4 0 2
0 1
1 2
1 3
2 3

Sample Output

1
0

Author: LIU, Yaoting
Contest: ZOJ 10th Anniversary Contest



枚举所有点,把这个点去掉,从source和dest各一次bfs,标记即不和source连通也不和dest连通的点,标记的点的总数就是answer


#include <cstdio>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>

#ifdef _DEBUG
#define debug_printf(...) printf(__VA_ARGS__)
#else
#define debug_printf(...) 0
#endif

const int MAXN = 100;

std::vector<std::vector<int> > adj;

bool hidden[MAXN];

void bfs(int src, int d[])
{
    memset(d, -1, sizeof(*d) * MAXN);

    d[src] = 0;

    std::queue<int> que;
    que.push(src);

    while (! que.empty()) {

        int v = que.front();
        que.pop();

        if (hidden[v]) {
            continue;
        }

        assert(0 <= v && v < adj.size());

        for (int i=0; i<adj[v].size(); ++i) {
            int a = adj[v][i];
            if (d[a] == -1 && !hidden[a]) {
                d[a] = d[v] + 1;
                que.push(a);
            }
        }
    }
}

void solve()
{
    int vertices;
    int edges;
    int src;
    int dest;

    if (scanf("%d%d%d%d", &vertices, &edges, &src, &dest) == EOF) {
        exit(0);
    }

    adj.clear();
    adj.resize(vertices);

    for (int i=0; i<edges; ++i) {
        int a = 0, b = 0;
        scanf("%d%d", &a, &b);
        assert(0 <= a && a < adj.size());
        assert(0 <= b && b < adj.size());

        if (std::find(adj[a].begin(), adj[a].end(), b) == adj[a].end()) {
            adj[a].push_back(b);
        }

        if (std::find(adj[b].begin(), adj[b].end(), a) == adj[b].end()) {
            adj[b].push_back(a);
        }
    }

    bool onceUncovered[MAXN];
    memset(onceUncovered, 0, sizeof(onceUncovered));

    memset(hidden, 0, sizeof(hidden));

    int d[MAXN];
    int e[MAXN];

    for (int i=0; i<vertices; ++i) {
        if (i == dest || i == src) {
            //continue;
        }

        hidden[i] = true;

        bfs(src, d);
        bfs(dest, e);

        for (int v=0; v<vertices; ++v) {
            if (d[v] == -1 && e[v] == -1 && v != i && v != src && v != dest) {
                onceUncovered[v] = true;
            }
        }

        hidden[i] = false;
    }

    int answer = 0;
    for (int i=0; i<vertices; ++i) {
        if (onceUncovered[i] && i != src && i != dest) {
            ++answer;
        }
    }

    printf("%d\n", answer);
}

int main()
{
    while(true) {
        solve();
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

zoj 3583 Simple Path

自从区域赛以后就没参加浙大月赛这种比赛了 这题比赛的时候也没有过 有两种解法,这种是并查集 想象一下从s到t的一条简单路,想想简单路上每个点的性质:比如简单路上的点i,不管删去图上任何一...

zoj 3583 Simple Path

题意:给定一个无向图,输出不在s到d的简单路径上的点 题解: 1方法1dfs 先删点,然后从(前提:删除的不是s且s没有被拜访)s搜一次,再从(前提:删除的不是d且d没有被拜访)d搜一次,搜不到...

A sample Hamilton path hdu 3583

经典问题:哈密尔顿路径 所以一个整数i就表示了一个点集; 整数i可以表示一个点集,也可以表示是第i个点。 状态表示:dp[i][j]表示经过点集i中的点恰好一次,不经过其它的点,并且以j点为终点...

Gym-101353H Simple Path(树型dp)

传送门:https://odzkskevi.qnssl.com/86ae857f80d3f4ae7389f98461306080?v=1499831299 题意:定义一棵树的价值为:这棵树上...

Num 3 : ZOJ : 1241 Geometry Made Simple

原题链接 很考验输出格式和细心的题; submit了八次才AC……,也是一道坑题   :  (   .... Geometry Made Simple Time Limit: 2 ...

ZOJ-3581 A Simple Test 模拟连连看

n*m的矩阵,其中有k个格子是有图案的,q个询问,如果每次询问的两个格子上都有图案,且可以通过最多变相两次到达(路上不能有其他有图案的格子),这两个格子的图案并得到两分,否则-1分。 其实仔细想想就...

ZOJ 3686 A A Simple Tree Problem

开始想了一个错误的算法,对每个节点保存它的子树中的节点数目和其中为一的数目,操作某节点时向上更新其祖先的数据(log N),查询时直接输出。当时忽略了操作同时也需要更新后代的数据,这样的最坏复杂度是N...
  • zu_xu
  • zu_xu
  • 2013-04-02 22:19
  • 636

ZOJ 3686 A Simple Tree Problem DFS+线段树(区间取反)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4969 题意很简单。。 分析:先作一次DFS求出每个点的起、末位置(时...

ZOJ 3753 Simple Equation

[题意]让你解这样一个方程:AX+BY=XY

zoj-3658-Simple Function

E - Simple FunctionTime Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescrip...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)