洛谷傳送門 loj傳送門
勞資把$spfa$裡$cost$陣列初始化從$-1$改成$-inf$就特麼$a$了,梯形裡有負數,浪費了半個多小時,心態都崩了
問題難度好像是反過來的
源點向第一排的點都流量為$1$,費用為$0$的邊,最後一排的點向匯點連流量為$1$,費用為$0$的邊
第三問點點之間流量$inf$,費用為指向的點的權值
第二問沒啥好說的,點點之間的邊流量改成$1$就行了
因為最後一排可能有很多點,所以最後一排的點向匯點的流量改成$inf$
第一問拆點
乙個點不能被走$2$次,在拆開點之間連流量為$1$,費用為它權值的邊
一條邊不能被走$2$次,某點的出點向它能走的點的入點連流量為$1$,費用為$0$的邊
然後瞎**跑最大費用最大流就行了
【暴躁!!】
1 #include 2 #include 3 #include 4#define l1 55
5#define n1 1610
6#define m1 40010
7#define ll long long
8#define dd double
9#define inf 0x3f3f3f3f
10using
namespace
std;
1112
intgint()
1316
while(c>='
0'&&c<='9')
17return ret*fh;18}
19struct
edge
26}e,e;
27int
k,n,m,cnt,s,t;
28int a[n1],que[m1<<1
],hd,tl,cost[n1],flow[n1],use[n1],id[n1];
29int
spfa()
3048
}49 use[x]=0;50
}51return cost[t]!=-inf;52}
53int
ek()
5464}65
return
tcost;66}
6768
intmp[l1][l1],idd[l1][l1];
69int check(int x,int
y)72
73namespace
s183
if(check(i+1,j+1))84}
85for(i=1;i<=m;i++) e.ae(s,i,1,0), e.ae(i,s,0,0
);86
for(i=1;i<=n+m-1;i++) e.ae(idd[n][i]+cnt,t,1,0), e.ae(t,idd[n][i]+cnt,0,0
);87 printf("
%d\n
",ek());88}
89};
9091
namespace
s2102
for(i=1;i<=m;i++) e.ae(s,i,1,mp[1][i]), e.ae(i,s,0,-mp[1
][i]);
103for(i=1;i<=n+m-1;i++) e.ae(idd[n][i],t,inf,0), e.ae(t,idd[n][i],0,0
);104 printf("
%d\n
",ek());
105}
106};
107108
namespace
s3118
if(check(i+1,j+1))
119}
120for(i=1;i<=m;i++) e.ae(s,i,1,0), e.ae(i,s,0,0
);121
for(i=1;i<=n+m-1;i++) e.ae(idd[n][i]+cnt,t,inf,0), e.ae(t,idd[n][i]+cnt,0,0
);122 printf("
%d\n
",ek());
123}
124};
125126
intmain()
127
網路流24題 數字梯形問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這...
網路流24題 數字梯形問題
題面 傳送門思路 三合一題目 但是實際上做好了第乙個就沒有別的問題了 第一問 把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的 然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點 第二問 第一問中每個點內部的那條邊容量改成inf就好 第三問 直接dp算了...
網路流 24 題 數字梯形
題目描述 給定乙個由 n n n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m m m 個數字。從梯形的頂部的 m m m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。分別遵守以下規則 從梯形的頂至底的 m m m 條路徑互不相交 從梯形的頂至底的 m m ...