拓扑排序+动态规划

#include<cstring>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#define maxn 100010
using namespace std;
const long long mod = 1000000000 + 7;
typedef long long ll;
int de[maxn];
vector<int>G[maxn];
int list[maxn];
ll a[maxn];
ll b[maxn];
int t;
void insert(int be, int en) { G[be].push_back(en); }
ll ans = 0;
queue<int>que;
ll topu() {
while (!que.empty()) {
int x = que.front();
que.pop();
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
ans = (ans + (a[x] * b[p]) % mod) % mod;
a[p] = (a[p] + a[x]) % mod;
de[p]--;
if (de[p] == 0) {
que.push(p);
}
}
}
return ans%mod;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", &a[i], &b[i]);
}
int be, en;
for (int i = 0; i < m; i++) {
scanf("%d %d", &be, &en);
insert(be, en);
de[en]++;
}
for (int i = 0; i < n; i++) {
if (de[i] == 0) {
que.push(i);
}
}
ll a = topu();
printf("%lld\n", a%mod);
return 0;
}
寻找真正的热爱

浙公网安备 33010602011771号