A-3 Articulation Points 分数 25

In graph theory, given a connected graph G, the vertices whose removal would disconnect G are known as articulation points. For example, vertices 1, 3, 5, and 7 are the articulation points in the graph shown by the above figure (also given by the sample input).
It is a bit complicated to find the articulation points. Here you are only asked to check if a given vertex is an articulation point or not.
Input Specification:
Each input file contains one test case. For each case, the first line contains 3 positive integers: N (≤10^3), M (≤10^4), and K (≤100), which are the number of vertices, the number of edges, and the number of queries, respectively. Then M lines follow, each gives an undirected edge in the format:
v1 v2
where v1 and v2 are the two ends of an edge. Here we assume that all the vertices are numbered from 0 to N−1. It is guaranteed that v1 is never the same as v2, and the graph is connected.
Finally a line of queries are given, which contains K vertices to be checked. The numbers in a line are separated by spaces.
Output Specification:
Output a string of 0's and 1's in a line. That is, for each query, print 1 if the given vertex is an articulation point, or 0 if not. There must be no space between the answers.
Sample Input:
10 11 8
0 1
8 7
9 7
1 2
1 3
3 5
5 7
2 4
3 4
5 6
6 7
5 2 9 1 6 3 2 7
Sample Output:
10010101
代码长度限制
16 KB
Java (javac)
时间限制
900 ms
内存限制
256 MB
其他编译器
时间限制
400 ms
内存限制
64 MB
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
vector<vector<int>> v, vv, que;
bool status[1006];
int y, z;
void recursion(int st) {
    if (vv[st].size()==0||st==y) return;
    status[st] = true;
    for (int i = 0; i < vv[st].size(); i++)
        if(status[vv[st][i]] ==false&& vv[st][i]!=y) recursion(vv[st][i]);
}
int main() {
    int n, m, k, i, j;
    cin >> n >> m >> k;
    v.resize(n + 1);
    vv.resize(n + 1);
    for (i = 0; i < m; i++) {
        scanf("%d %d", &y, &z);
        vv[y].push_back(z);
        vv[z].push_back(y);
    }
    for (i = 0; i < k; i++) {
        cin >> y;
        fill(status, status + 1006, false);
        status[y] = true;
        if(y!=0) recursion(0);
        else recursion((y+1)%m);
        int res = -9;
        for (j = 0; j < n; j++) {
            if (j!= y && status[j] == false) {
                res = 9;
                break;
            }
        }
        if (res > 0) cout << "1";
        else cout << "0";
    }
    return 0;
}


















