您的位置:首页 > 其它

CCF 20171203(商路)

2018-03-16 16:28 148 查看
题目分析:
    题目很长,有点儿不理解,后来看人家的代码,边看边调,才知道自己误解了题目的意思。

    本来想着应该是dp,就是每个城市的商路最大价值是它的下级中的最大价值或者是它到其中一个城市的价值。后来发现不可以是取它下级中的最大价值,因为这个城市的商路最大价值是有可能小钰它下级的最大价值的。所以应该在每一个最后的没有下级的城市向上遍历它的上级,即不断更新如果上级直接到这个城市的最大价值。

    未满分。#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
const long long Mod = 1e18;
long long f[maxn],u[maxn],s[maxn],v[maxn];
long long ans[maxn];
long long q[maxn];
int vis[maxn];
int main()
{
int t;
scanf("%d",&t);

while(t--)
{
memset(vis,0,sizeof(vis));
memset(q,0,sizeof(q));
memset(ans,0,sizeof(ans));

int n;
scanf("%d",&n);

for(int i = 1; i <= n; i ++)
{
scanf("%d%d%d%d",&u[i],&s[i],&v[i],&f[i]);
vis[u[i]]++;
}
int q1=0,q2=0;
for(int i = 1; i <= n; i ++)
if(vis[i] == 0 )
q[q1++] = i;

while(q1 > q2)
{
int k = q[q2++];
int u1 = u[k];
int d = s[k];
vis[u1]--;
if(vis[u1] == 0) q[q1++] = u1;
while(u1)
{
ans[u1] = max(ans[u1],ans[k] + v[u1] - (f[u1]-d)*(f[u1]-d));
d += s[u1];
u1 = u[u1];

}

}
long long cnt=0;
for(int i=1 ; i <= n; i++)
cnt =(cnt + ans[i])%Mod;
cout<<cnt<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: