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();
    }
}


LCA+并查集应用(好题)poj3728

Language: Default The merchant Time Limit: 3000MS   Memory Limit: 65536K Total S...
  • u010660276
  • u010660276
  • 2014年08月13日 15:07
  • 821

ZOJ - 3496 Assignment 上下界最大流+二分

题目链接点这里 毒瘤题,,wa了无数发,,,才发现当m==0的时候,,会输出一些奇怪的东西。。。 以后,,不管什么题都要记得特判,,恩,,,不然会死的很惨。。 #include #inc...
  • qq_30927651
  • qq_30927651
  • 2017年03月31日 23:04
  • 187

ZOJ2838【LCA在线查询】

模板题。 推荐博文:点我打开链接 博主再啰嗦几句: 储存遍历序列的数组ver[ ]; 每个结点第一次出现的位置的数组 First[ ]; 当前位置的深度的数组 deep[ ]   ...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017年04月08日 21:42
  • 428

九度OJ 题目1006:ZOJ问题

一.题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。  是否AC的规则如下: 1. zoj能AC; 2. 若字符串形式为xzojx,则也能AC,其中x可...
  • lhyer
  • lhyer
  • 2015年08月07日 20:53
  • 899

浙大ZOJ 1009 Enigma问题解决及别人的解决方案

教训:在这题上浪费太多次机会了,因为以下几个原因: 1. 没考虑到m(m为轮子字母表的规模)为1的情况,从而导致出现“Floating Point Error”。通过将“if(i!=0&&i%(m-...
  • xiaogugood
  • xiaogugood
  • 2014年01月06日 17:16
  • 1650

POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一、基本算法:        (1)枚举 (1753,2965)  ...
  • dg357442101
  • dg357442101
  • 2016年03月13日 14:24
  • 3476

ZOJ 3496 二分+上下界网络流

二分+上下界网络流 #include #include #include using namespace std; const int maxn = 510; const int inf =...
  • c3568
  • c3568
  • 2013年10月25日 20:56
  • 1373

ZOJ 3763 —— Plasma Field(几何,数学)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3763 虽然题目有点长,但是仔细读下来发现也没什么。。。 给一个关...
  • hongrock
  • hongrock
  • 2014年03月10日 15:59
  • 614

zoj 动态规划分类

动态规划  解 #1100 经典,状态压缩 DP,要先枚举出行全部可能的状态,DP[i][j] 表示 i 层,j 末状态,dp[i][st[j][1]]+=dp[i-1][st[j][0]]; ...
  • yan_____
  • yan_____
  • 2013年03月21日 21:19
  • 671

浙大ZOJ 1003 Crashing Ballon问题解决及其他人的做法

完成了在ZOJ上的处女题,小兴奋,在此记录一下: 一、工程代码加上算法设计注释 --------------------------------------------------crash_ball...
  • xiaogugood
  • xiaogugood
  • 2013年12月31日 13:55
  • 2032
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zoj 3583 simple path
举报原因:
原因补充:

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