CE?
  • 板块学术版
  • 楼主xiaoliebao1115
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/6/2 15:24
  • 上次更新2024/6/2 17:26:43
查看原帖
CE?
701387
xiaoliebao1115楼主2024/6/2 15:24
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100; // 最大顶点数
const int maxm = 10010; // 最大边数
struct Edge {
    int to, nxt;
} e[maxm << 1];
int ecnt;  // 用于边表计数
int head[maxn];
void addEdge(int u, int v) {  // 加入一条无向边
    ++ecnt;
    e[ecnt].to = v;
    e[ecnt].nxt = head[u];
    head[u] = ecnt;
}
int n; // 顶点数
int m; // 边数
int dfn[maxn]; // 时间戳
int low[maxn]; // 能不经过父亲到达最小的编号
bool flag[maxn]; // 标记是不是割点
int timer,op; 

void tarjan(int u, int father,int ggb) {
    dfn[u]=low[u]=++timer;
    int child=0;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==ggb) continue;
        if(dfn[v]==0)
        { child++;
         tarjan(v,u,ggb);
         low[u]=min(low[u],low[v],ggb);
         if(low[v]>=dfn[u]) op++;
        }
        else if(v!=father)
        {
            low[u]=min(low[u],dfn[v],ggb);
        }
    }
    if(u==father&&child==1)
    op++;
}
int biao[maxn];
int cnt,ans;
void dfs(int u)
{
    cnt++;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(biao[v]==0)
        {
            biao[v]=1;
            dfs(v);
        }
    }
}
int main() {
    freopen("war.in","r",stdin);
    freopen("war.out","w",stdout);
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        addEdge(u, v);
        addEdge(v, u);
    }
    for(int i=1;i<=n;i++)
    {
        //memset(biao,0,sizeof(biao));
        // memset(dfn,0,sizeof(dfn));
        biao[i]=1;
        int sum=0,k=0;
        for(int j=1;j<=n;j++)
        {
            if(i!=j&&biao[j]==0)
            {
                cnt=0;
                dfs(j);
                sum++;
                if(sum==1) k++;
            }
        }
        if(sum==2)
        {
            if(k==1) ans+=n-2;
            if(k==0) ans+=n-1;
        }
        if(sum>=3) ans+=n-1;
        if(sum==1)
        {
            op=0;
            for(int j=1;j<=n;j++)
            {
                if(i!=j&&dfn[i]==0)
                {
                    tarjan(j,j,i);
                }
            }
            ans+=op;
        }
    }
    cout<<ans<<endl;
    return 0;
}

2024/6/2 15:24
加载中...