洛谷AC SPOJ WA悬关求助!
查看原帖
洛谷AC SPOJ WA悬关求助!
463956
incra楼主2023/9/6 18:32

rt,代码如下:

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 100010,M = 2 * N;
int n,m;
int h[N],e[M],ne[M],idx;
int dfn[N],low[N],timestamp;
int cut_cnt;
bool cut[N];
int root;
int vis[N],cnt,num;
void add (int a,int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}
void tarjan (int u,int fa) {
    dfn[u] = low[u] = ++timestamp;
    for (int i = h[u];~i;i = ne[i]) {
        int j = e[i];
        if (j == fa) continue;
        if (!dfn[j]) {
            tarjan (j,u);
            low[u] = min (low[u],low[j]);
            if (low[j] >= dfn[u]) {
                if (u != root) cut[u] = true;
                else cut_cnt++;
            }
        }
        else low[u] = min (low[u],dfn[j]);
    }
}
void dfs (int u) {
    vis[u] = cnt;
    num++;
    for (int i = h[u];~i;i = ne[i]) {
        int j = e[i];
        if (cut[j] && vis[j] != cnt) {
            cut_cnt++;
            vis[j] = cnt;
        }
        if (!vis[j]) dfs (j);
    }
}
int main () {
    int T = 1;
    while (cin >> m,m) {
        memset (h,-1,sizeof (h));
        memset (dfn,0,sizeof (dfn));
        memset (low,-1,sizeof (low));
        memset (vis,0,sizeof (vis));
        memset (cut,false,sizeof (cut));
        timestamp = idx = cnt = n = 0;
        while (m--) {
            int a,b; 
            cin >> a >> b;
            add (a,b),add (b,a);
            n = max (n,max (a,b));
        }
        for (int i = 1;i <= n;i++) {
            if (!dfn[i]) {
                root = i;
                cut_cnt = 0;
                tarjan (i,i);
                if (cut_cnt >= 2) cut[i] = true;
            }
        }
        LL ans1 = 0,ans2 = 1;
        for (int i = 1;i <= n;i++) {
            if (!vis[i] && !cut[i]) {
                cnt++;
                num = cut_cnt = 0;
                dfs (i);
                if (!cut_cnt) {
                    if (num > 1) {
                        ans1 += 2;
                        ans2 *= (num - 1) * num / 2;
                    }
                    else ans1++;
                }
                else if (cut_cnt == 1) {
                    ans1++;
                    ans2 *= num;
                }
            }
        }
        cout << "Case " << T++ << ": " << ans1 << ' ' << ans2 << endl;
    }
    return 0;
}

还有UVA的经验有没有什么输出格式要注意?

2023/9/6 18:32
加载中...