C++ 算法题:互粉攻略 - 人气指数计算
#include
using namespace std;
const int N = 1010;
int n, m; int h[N], e[N], ne[N], idx; int din[N], dout[N]; // 入度和出度 int q[N * 2], tt; // 队列
void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; }
int main() { memset(h, -1, sizeof h); cin >> n >> m; while (m--) { int a, b; cin >> a >> b; add(b, a); // 注意这里是 b -> a,表示 a 的入度加 1,b 的出度加 1 dout[b]++, din[a]++; // 维护入度和出度 }
for (int i = 0; i < n; i++)
if (!din[i]) q[++tt] = i; // 所有入度为 0 的点入队
while (tt)
{
int t = q[tt--];
for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i];
din[j]--; // 当前点的出度减 1
dout[t]--; // 当前点的入度减 1
if (!din[j]) q[++tt] = j; // 如果 j 的入度为 0,入队
}
}
for (int i = 0; i < n; i++)
cout << dout[i] - din[i] << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/nP5w 著作权归作者所有。请勿转载和采集!