这个题是昨天做的!!这是一个很容易实现的模拟题,本来样例过了我一看还挺开心的,然后提交了之后收到了<当头一棒>……第三个样例和第五个样例总是过不去。。于是乎一头雾水地下载了测试数据之后笔算了一下,结果愣是和sample output的答案大相径庭。。
诶……懵啊。
之后看了题解才恍然大悟。
下面是AC代码。
#include<iostream>
#include<algorithm>
using namespace std;
int n, p;
int maxm=0;
int findn[100], co = 0;
int cel[200], cell[200];
int pr[102], prr[102];
int conec[102][102];
int state[102], flag[102];
int flag2 = 0;
int func(int sig)
{
if (state[sig] != 0||flag[sig]==1)return state[sig];
for (int i = 0; i <= maxm; i++)
{
if (conec[i][sig] == 0)continue;
state[sig] += conec[i][sig] * func(i);
}
state[sig] =state[sig]+cel[sig]- cell[sig];
if (state[sig] < 0) { state[sig] = 0; }flag[sig] = 1;
return state[sig];
}
int main()
{ cin >> n >> p;
for (int i = 1; i <= n; i++) { cin >> cel[i] >> cell[i]; if (cel[i] != 0)cell[i] = 0; }
if (p == 0)
{ for (int i = 1; i <= n; i++)
{ cout << i << " " << cel[i]; if (i <= n - 1)cout << endl; }
//system("pause");
return 0; }
int u, k;
for (int i = 0; i < p; i++)
{
cin >> u >> k;
pr[i] = u, prr[i] = k;
cin >> conec[u][k];
maxm = max(k, maxm);
}
int f = 0;
for(int j=0;j<p;j++)
for (int w = 0; w < p; w++)
{
f = 0;
for (int i = 0; i <= co; i++)
{
if (prr[j] == findn[i]) { f = 1; break; }
}
if (f == 1)continue;
if (pr[w] == prr[j])break;
if (w == p-1)findn[co++] = prr[j];
}
sort(findn, findn + co);
for (int i = 0; i < co; i++)
{
int p=func(findn[i]);
if (p > 0) { cout << findn[i] << " " << p; flag2 = 1;
if (i < co - 1)cout << endl;
}
}
if (flag2 == 0)cout << "NULL";
//system("pause");
return 0;
}