鏈涓嶈鎸傜殑鏄涓棰樸傜涓闂氨鏄釜瑁哥殑鏈澶ч棴鍚堝瓙鍥撅紝鍏抽敭灝卞嚭鍦ㄧ浜岄棶涓婏紝瑕佹眰鏈澶ч棴鍚堝瓙鍥劇殑鏈灝忓閲忋傛湰娌欒尪鍚庢潵鎵嶅彂鐜拌繖绔熺劧鏄疨KU鍘熼錛侊紙PKU2987錛夛紝鍥犱負錛屾渶澶ф祦姹傚嚭鏉ョ殑鏈澶ч棴鍚堝瓙鍥句竴瀹氭槸瀹歸噺鏈灝忕殑錛佹晠絎簩闂彧瑕佸湪姹傚嚭鏈澶ф祦鍚庢潵涓嬈¢亶鍘嗭紝鎵懼埌S鍙揪鐨勭粨鐐逛釜鏁板嵆鍙?br>
璇︾粏璇佹槑錛堣漿緗戜笂鏌愮鐘囩殑錛夛細
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?span style="COLOR: #ffffff">鏈澶ф潈涓嶅彲鑳芥槸璐熸暟錛屽綋鏄?鐨勬儏鍐碉紝鑷劧鏄竴涓偣涓嶉夋渶浼橈紝涓嬮潰鎺㈣蹇界暐0鐨勬儏鍐點?br>
1錛氶鍏堟垜鍋囪鏈変袱涓棴鍚堝瓙鍥鵑兘鎷ユ湁鐩稿悓鐨勬渶澶ф潈錛屽茍涓旀病鏈夊叡鍚岀偣錛?span style="COLOR: red">寰堝鏄撹瘉鏄庝笉浼氬嚭鐜拌繖縐嶆儏鍐碉紝鍥犱負濡傛灉鎴戜滑鎶婁袱涓棴鍚堝瓙鍥鵑兘閫夋嫨涓婏紝閭d箞鏈澶ф潈浼氬彉澶с?/span>
2錛氫粛鐒跺亣璁炬湁涓や釜闂悎瀛愬浘閮芥嫢鏈夌浉鍚岀殑鏈澶ф潈錛屼絾鏄湁鍏卞悓鐐癸紝鍗抽噸鍙犵殑鎰忔濄傛牴鎹棴鍚堝浘鐨勭壒鐐癸紝榪欎簺鍏卞悓鐐逛笉鏄殢鎰忕殑錛屽彲浠ョ煡閬擄紝鍙鏈変竴涓偣鐩稿悓錛岄偅涔堣繖涓偣鐨勮兘鍒拌揪鐨勬墍鏈夊悗緇偣閮藉繀瀹氭槸鍏卞悓鐐廣傛墍浠ヤ細寰楀嚭涓涓粨璁猴紝涓や釜闂悎瀛愬浘閲嶅彔錛岄噸鍙犵殑閮ㄥ垎蹇呯劧鏄?涓垨鑰呭涓笉閲嶅彔闂悎鍥俱?br>
鐒跺悗鎴戜滑鑰冭檻涓嶉噸鍙犵殑閮ㄥ垎錛岃繖閮ㄥ垎鐨勭偣鏉冨拰鍙互璇佹槑涓瀹氭槸闈炶礋銆傛垜浠彲浠ュ亣璁鵑潪閲嶅彔閮ㄥ垎鐨勭偣鏉冨拰鏄礋鏁幫紝閭d箞鍋囧鎴戜滑鍒犳帀榪欓儴鍒嗭紝鍙夊彇閲嶅彔閮ㄥ垎錛堝洜涓洪噸鍙犻儴鍒嗚偗瀹氭槸闂悎鍥撅級錛岄偅涔堟渶澶ф潈涔熶細鍙樺ぇ錛岀煕鐩俱傛墍浠?span style="COLOR: red">闈為噸鍙犻儴鍒嗙偣鏉冨拰涓瀹氭槸闈炶礋鏁般?br> 涓嬮潰緇х畫鎺㈣闈為噸鍙犻儴鍒嗙殑鎬ц川銆備笂闈㈢殑璇佹槑宸茬粡寰楀嚭浠栦滑鐨勭偣鏉冨拰涓瀹氭槸闈炶礋銆備笅闈㈠厛鎶涘紑鐐規潈鍜岀瓑浜?鐨勬儏鍐碉紝鍏堣璁烘鏁扮殑鎯呭喌銆?br>鍋囪涓や釜闂悎瀛愬浘鐨勯潪閲嶅彔閮ㄥ垎閮芥槸姝f暟錛岄偅涔堟妸榪欎袱涓儴鍒嗗姞璧鋒潵閲嶆柊鏋勬垚闂悎鍥撅紝鏈澶ф潈蹇呯劧浼氬彉澶э紝涓庡亣璁劇殑涓や釜鍚屼負鏈澶ф潈鐨勯棴鍚堝浘鐭涚浘銆傚浐鍙互璇佹槑闈為噸鍙犻儴鍒嗙殑鐐規潈鍜岃偗瀹氭槸0銆?br>
鎺㈣鍒拌繖閮ㄥ垎錛屾垜浠凡緇忓彲浠ュ垵姝ュ緱鍑轟竴涓粨璁猴紝灝辨槸涓涓渶澶ф潈闂悎瀛愬浘鐨勭偣鏁板灝戦棶棰樺彧鑳藉彈鍒頒竴浜?鏉冨拰瀛愬浘錛堟墍鏈夌偣鏉冨姞璧鋒潵絳変簬0鐨勫瓙鍥撅級鐨勫共鎵般?br>
閲嶇偣鏉ュ埌榪欎簺0鏉冨拰瀛愬浘涓娿備笅闈㈡垜浠張鏉ュ仛涓涓亣璁撅紝灝辨槸鍋囪鎴戜滑姹傚嚭浜嗕竴涓渶澶ф潈闂悎瀛愬浘錛屽茍涓旈噷闈㈡湁鍖呭惈鍒頒竴浜?鏉冨拰瀛愬浘銆傝屾垜浠繖鏃跺欓渶瑕佸仛鐨勫氨鏄壘鍒伴偅浜涘彲浠ュ垹鍘葷殑0鏉冨拰瀛愬浘錛屽綋鎴戜滑鍒犲幓浜嗘墍鏈夌殑榪欎簺瀛愬浘錛岄偅涔堢偣鏁板氨鍙互杈懼埌鏈灝忋?br>
鍏抽敭鏉ヤ簡銆傚埌搴曞摢浜?鏉冨拰瀛愬浘鏄彲浠ュ垹鍘葷殑錛屽摢浜?鏉冨拰瀛愬浘鏄笉鍙互鍒犲幓鐨勫憿錛?br>
鏍規嵁闂悎鍥劇殑鎬ц川錛屾垜浠鍒犻櫎涓涓偣錛岄偅涔堝繀欏繪妸鎵鏈夎兘鍒拌揪榪欎釜鐐圭殑鐐瑰垹鍘匯傞偅涔堝緢娓呮櫚鐨勭湅鍒拌鍒犻櫎涓涓瓙鍥撅紝蹇呴』淇濊瘉鍦ㄨ繖涓瓙鍥懼娌℃湁浠諱綍涓涓偣鎸囧悜榪欎釜瀛愬浘銆備篃灝辨槸璇?span style="COLOR: red">榪欎釜瀛愬浘鏄皝闂殑錛屽彧鏈夊嚭杈癸紝娌℃湁鍏ヨ竟銆?br>
鏈鍚庝竴姝ワ紝鍋囧鎴戜滑鑳借瘉鏄庡湪姹傝В鏈澶ф潈闂悎鍥劇殑榪囩▼涓繚璇佷笉浼氶変笂榪欎簺0鏉冨拰瀛愬浘錛岄偅涔堣繖涓瘉鏄庡氨鍙互緇撴潫浜嗐?br>閫氳繃鏈澶ф祦姹傝В鏈澶ф潈闂悎瀛愬浘錛屾垜浠妸姝g偣鏉冨拰婧愮偣寤鴻竟錛岃竟鏉冧負鐐規潈鍊鹼紝璐熺偣鏉冨拰姹囩偣寤鴻竟錛岃竟鏉冧負鐐規潈緇濆鍊箋備粩緇嗗垎鏋愭眰瑙f渶澶ф祦鐨勮繃紼嬶紝浼氬彂鐜頒竴浜涗笢瑗褲?br>
鐢變簬閭d簺鍙夊彲涓嶉夌殑0鏉冨拰瀛愬浘鏄皝闂殑錛屾病鏈夊叆杈圭殑錛岄偅涔堝湪姹傝В鏈澶ф祦鐨勮繃紼嬩腑錛屼笉鍙兘鏈夊閮ㄦ祦琛ュ厖錛屾墍浠?span style="COLOR: red">榪欎簺0鏉冨拰瀛愬浘鐨勬瘡涓偣涓庢簮鎴栬呮眹鐨勮竟閮芥槸婊℃祦鐨勩?br>
鏈鍚庢眰鏈澶ф潈闂悎瀛愬浘鐨勭偣錛屾柟娉曟槸浠庢簮鐐瑰紑濮嬮氳繃闈炴弧嫻佽竟鎼滅儲涓涓仈閫氬浘錛屽浘鍐呯殑鐐癸紙闄や簡婧愮偣錛夊氨鏄眰鍑烘潵鐨勬渶澶ф潈闂悎瀛愬浘鐨勭偣銆傝屼笂闈㈣瘉鏄庡埌0鏉冨拰瀛愬浘鐨勭偣鍜屾簮姹囬兘鏄弧嫻侊紝騫朵笖娌℃湁鍏ヨ竟錛屽嚭杈逛篃娌℃湁嫻侊紝閭d箞鑲畾鏃犳硶浠庢簮鐐規悳绱㈠埌銆傞偅涔堝湪姹傝В鐨勮繃紼嬩腑榪欎簺0鏉冨拰瀛愬浘鐨勭偣鏄偗瀹氭病鏈夐変笂鐨勩?br>
灝辨璇佹瘯銆?br> 緇撹錛?span style="COLOR: red">閫氳繃鏈澶ф祦姹傝В鏈澶ф潈闂悎瀛愬浘鐨勯棶棰橈紝姹傚嚭鏉ョ殑闂悎瀛愬浘鐐規暟涔熸槸鏈灝戠殑銆?br>
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?br>浠g爜錛?br>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 10002, MAXM = 120000, INF = ~0U >> 2;
struct edge {
int a, b, f, next;
edge () {}
edge (int _a, int _b, int _f) : a(_a), b(_b), f(_f), next(-1) {}
} ed[MAXM + MAXM];
int n, m = 0, s, t, hd[MAXN], tl[MAXN], st[MAXN], lev[MAXN], pr[MAXN], hs[MAXN], q[MAXN], now, res = 0, res_num = 0;
bool vst[MAXN];
void add_edge(int a, int b, int f)
{
ed[m] = edge(a, b, f);
if (hd[a] != -1) tl[a] = ed[tl[a]].next = m++; else hd[a] = tl[a] = m++;
ed[m] = edge(b, a, 0);
if (hd[b] != -1) tl[b] = ed[tl[b]].next = m++; else hd[b] = tl[b] = m++;
}
void init()
{
freopen("profit.in", "r", stdin);
int n0, m0, a0, b0, x;
scanf("%d%d", &n0, &m0);
n = n0 + 2; s = 0; t = n - 1;
memset(hd, -1, n << 2); memset(tl, -1, n << 2);
re1(i, n0) {
cin >> x;
if (x > 0) {add_edge(s, i, x); res += x;}
if (x < 0) add_edge(i, t, -x);
}
re1(i, m0) {
scanf("%d%d", &a0, &b0);
add_edge(a0, b0, INF);
}
fclose(stdin);
}
void aug()
{
int z = hs[t], i = t, p;
while (i != s) {
hs[i] -= z; p = pr[i]; ed[p].f -= z; ed[p ^ 1].f += z; i = ed[p].a;
if (!ed[p].f) now = i;
}
res -= z;
}
bool dfs()
{
q[0] = s; memset(vst, 0, n); vst[s] = 1; lev[s] = 0;
int i, j, f0;
for (int front=0, rear=0; front<=rear; front++) {
i = q[front];
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (!vst[j] && f0) {vst[j] = 1; lev[j] = lev[i] + 1; q[++rear] = j;}
}
}
if (!vst[t]) return 0;
now = s; memset(vst, 0, n); hs[s] = INF;
re(i, n) st[i] = hd[i];
bool ff;
while (!vst[s]) {
if (now == t) aug();
ff = 0;
for (int p=st[now]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (lev[now] + 1 == lev[j] && !vst[j] && f0) {st[now] = pr[j] = p; hs[j] = hs[now] <= f0 ? hs[now] : f0; now = j; ff = 1; break;}
}
if (!ff) {
vst[now] = 1;
if (now != s) now = ed[pr[now]].a;
}
}
return 1;
}
void solve()
{
while (dfs()) ;
q[0] = s; memset(vst, 0, n); vst[s] = 1;
int i, j, f0;
for (int front=0, rear=0; front<=rear; front++) {
i = q[front];
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (!vst[j] && f0) {vst[j] = 1; res_num++; q[++rear] = j;}
}
}
}
void pri()
{
freopen("profit.out", "w", stdout);
printf("%d\n%d\n", res, res_num);
fclose(stdout);
}
int main()
{
init();
solve();
pri();
return 0;
}

]]>