2019.1.6 洛谷1038

这个题是昨天做的!!这是一个很容易实现的模拟题,本来样例过了我一看还挺开心的,然后提交了之后收到了<当头一棒>……第三个样例和第五个样例总是过不去。。于是乎一头雾水地下载了测试数据之后笔算了一下,结果愣是和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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43484101/article/details/85912019