Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这个题的数据太弱了吧

Posted by swust_fang at 2016-05-09 16:04:10 on Problem 3352
8 9
1 2
2 3
3 4
4 2
3 5
5 6
6 7
7 5
7 8

这个应该是1

然而我XJB写的跑出来是2,居然过了
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

const int N = 10000+10;

struct node
{
    int en;
    bool bridge;
    int next;
}E[N];

int ans;
int top;
int n,m;
int dfs_clock;
int dfn[N];
int low[N];
bool vis[N];
int head[N];
int cntb;

void Init()
{
    ans = 0;
    top = 0;
    dfs_clock = 1;
    for(int i = 0;i < N;i++)
    {
        vis[i] = false;
        head[i] = -1;
        dfn[i] = 0;
        low[i] = 0;
    }
}

void add(int u,int v)
{
    E[top].en = v;
    E[top].bridge = false;
    E[top].next = head[u];
    head[u] = top++;
}

void Find_Bridge(int u,int fa)
{
    dfn[u] = low[u] = dfs_clock++;
    int child = 0;
    for(int i = head[u]; i != -1; i = E[i].next)
    {
        int v = E[i].en;
        if(!dfn[v])
        {
            Find_Bridge(v,u);
            if(low[u] > low[v])
                low[u] = low[v];
            if(low[v] > dfn[u])
                E[i].bridge = true;
        }
        else if(dfn[u] > dfn[v] && v != fa)
            low[u] = min(low[u],dfn[v]);
    }
}

void dfs_bridge(int u,int fa)
{
    int flag = false;
    for(int i = head[u]; i != -1; i = E[i].next)
    {
        if(E[i].bridge && E[i].en != fa)
        {
            E[i].bridge = false;
            flag = true;
            dfs_bridge(E[i].en,u);
        }
    }
    if(!flag)
    {
        //printf("%d  ",u);
        cntb++;
    }
}

void dfs(int u)
{
    vis[u] = true;
    for(int i = head[u]; i != -1; i = E[i].next)
    {
        int v = E[i].en;
        if(!vis[v])
        {
            if(E[i].bridge)
            {
                cntb = 0;
                dfs_bridge(u,-1);
                ans += cntb;
            }
            dfs(v);
        }
    }
}

int main()
{
    int T = 1;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        Init();
        for(int i = 1;i <= m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
        }
        Find_Bridge(1,-1);
        dfs(1);
        printf("%d\n",(ans+1)/2);
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator