● .Codeforces Round #221 (Div. 2) - B. I.O.U
فرض کنید سه نفر به نامهای A و B و C داریم؛ A اندازه ی 20دلار به B، B اندازه ی 20دلار به C بدهکار است. مجموع بدهی ها 40دلار است ولی باید نوعی آنها را سازماندهی کنیم که مجموع بدهی ها کمینه شود، پس اینگونه می نویسیم که A اندازه ی 20دلار به C بدهکار است، CوB به کسی بدهکار نیستند که در اینصورت مجموع بدهی ها 20 بوده و بدهکاری ها، همان حالت قبلی را شکل می دهد.
می خواهیم شکل توسعه یافته ی این مثال را برای nنفر حل کنیم که m بدهکاری بین آنها وجود دارد. به عبارت دیگر، در نهایت برای هر یک از افراد، تفاوت بین کل پولی که باید به او بدهید و پول او باید همان باشد.به ازای هر m و n مطلوب است یافتن کمترین مجموع بدهی هایی که بین آنهاست.
4 3
1 2 1
2 3 1
3 1 1
0
ورودی:
خط اوّل، شامل عدد طبیعی n و عدد حسابی m به ترتیب نشان دهنده ی تعداد افراد و تعداد بدهی هاست.(n ≤ 100 و m ≤ 104)
در m خط بعدی، در هر خط سه عدد ai و bi و ci داده می شود که نشان فرد شماره ai اندازه ی ci دلار به فرد شماره bi بدهکار است. (افراد را از 1 تا n شماره گذاری کنید)
(1 ≤ ai, bi ≤ n; ai ≠ bi; 1 ≤ ci ≤ 100)
این تضمین شده است که اگر در ورودی داده شده، فرد x به y بدهکار باشد، جای دیگری فرد y به x بدهکار نخواهد بود.
خروجی:
به عنوان خروجی، یک عدد صحیح که برابر با کمینه ی مجموع بدهکاری هاست را چاپ کنید.
پ.ن: در نمونه کادر بالا، شما می توانید تمام بدهی ها را لغو کنید، در نتیجه مجموع بدهی ها 0 خواهد بود.
// A Drop of the Programming Sea - adops.blog.ir #include <iostream> using namespace std; const unsigned int mxn = 1.e3; int person[mxn], res; int main() { int n, m; cin >> n >> m; for(int i=0; i<m; i++) { int a, b, c; cin >> a >> b >> c; person[a] += c; person[b] -= c; } for(int i=1; i<=n; i++) if(person[i] > 0) res += person[i]; cout << res << endl; }