社区讨论

关于 HDU 2433

学术版参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2gk7xl
此快照首次捕获于
2023/10/23 13:29
2 年前
此快照最后确认于
2023/10/23 13:29
2 年前
查看原帖
这道题我的代码一直 WA,和暴力对拍了很久也没过,求大佬指点。
CPP
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 105;
const int MAXM = 3005;
const int inf = 0x3f3f3f3f;
int n, m;
struct Edge {
    int to, idx;
    Edge (int _to = 0, int _idx = 0) :
        to(_to), idx(_idx) {}
};
vector<Edge> e[MAXN];
long long ans[MAXM] = {0};
int dis[MAXN] = {0};
bool vld[MAXM] = {false};
void bfs(int st) {
    memset(dis, 0x3f, sizeof dis);
    queue<int> q;
    q.push(st), dis[st] = 0;
    while (!q.empty()) {
        int h = q.front();
        q.pop();
        for (int id = 0; id < (int)e[h].size(); id++) {
            Edge i = e[h][id];
			if (!vld[i.idx] && dis[i.to] > dis[h] + 1) {
                dis[i.to] = dis[h] + 1;
                q.push(i.to);
            }
		}
    }
}
bool inTr[MAXM] = {false};
bool vis[MAXN] = {false};
bool f[MAXM] = {0};
void build(int st) {
    memset(inTr, false, sizeof inTr);
    memset(vis, false, sizeof vis);
    queue<int> q;
    q.push(st), vis[st] = true;
    while (!q.empty()) {
        int h = q.front();
        q.pop();
        for (int id = 0; id < (int)e[h].size(); id++) {
        	Edge i = e[h][id];
		    if (!vis[i.to] && dis[i.to] == dis[h] + 1) {
                inTr[i.idx] = vis[i.to] = true;
                q.push(i.to);
            }
    	}
    }
}
void slv(int x) {
    bfs(x);
    build(x);
    long long sum = 0;
    bool flg = false;
    for (int i = 1; i <= n; i++)
        if (dis[i] == inf) 
            flg = true;
        else
            sum += dis[i];
    for (int i = 1; i <= n; i++) {
        for (int id = 0; id < (int)e[i].size(); id++) {
        	Edge j = e[i][id]; 
            f[j.idx] = flg;
            if (inTr[j.idx]) {
                vld[j.idx] = true;
                bfs(x);
                vld[j.idx] = false;
                for (int k = 1; k <= n; k++)
                    if (dis[k] == inf)
                        f[j.idx] = true;
                    else
                        ans[j.idx] += dis[k];
            }
            else
                ans[j.idx] += sum;
        }
    }
}
int main() { 
    while (cin >> n >> m) {
        for (int i = 1; i <= n; i++)
            ans[i] = 0, e[i].clear();
        for (int i = 1, u, v; i <= m; i++) {
            scanf("%d%d", &u, &v);
            e[u].push_back(Edge(v, i));
            e[v].push_back(Edge(u, i));
        }
        for (int i = 1; i <= n; i++)
            slv(i);
        for (int i = 1; i <= m; i++)
            if (f[i])
                printf("INF\n");
            else
                printf("%lld\n", ans[i] / 2);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...