【图论】[ACM]嗅探器

来源:互联网 发布:js window.scroll 编辑:程序博客网 时间:2024/06/05 09:16

就是按照一个点作为根然后再这上面搞一下寻找割点,如果找到了,判断另一个点是不是在当前的割点的子树中(是相对于当前子树而言是一个割点)。如果在,那么就更新ans为最小值就行了

#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <iostream>using namespace std;const int MAXN = 100;const int MAXM = 10000;struct node{    int v;    node *next;}Edges[MAXM * 2 + 10], *adj[MAXN+10], *ecnt=Edges;int ver, ans=1000000000;void addedge(int u, int v){    ++ecnt;    ecnt->v = v;    ecnt->next = adj[u];    adj[u] = ecnt;}vector<int> vec;int dfn[MAXN+10], low[MAXN+10],  dcnt, root;int cut[MAXN+10];bool have[MAXN+10];void dfs(int u, int fa){    dfn[u] = low[u] = ++dcnt;    have[u] = u == ver;    for(node *p=adj[u];p;p=p->next){        int v= p->v;        if(!dfn[v]){            dfs(v, u);            have[u] = have[v] || have[u];            low[u] = min(low[u], low[v]);            if(low[v] >= dfn[u] && fa != -1){                if(have[v])                    ans = min(ans, u);            }        }else if(v != fa)            low[u] = min(low[u], dfn[v]);    }}int main(){    int n, u;    scanf("%d", &n);    while(scanf("%d%d", &u, &ver)&&u&&ver){        addedge(u, ver);        addedge(ver, u);    }    scanf("%d%d", &u, &ver);    dfs(u, -1);    if(ans != 1000000000){        printf("%d\n", ans);        return 0;    }    printf("No solution\n");    return 0;}
0 0
原创粉丝点击