題面:
傳送門思路:
三合一題目
但是實際上做好了第乙個就沒有別的問題了
第一問:
把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的
然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點
第二問:
第一問中每個點內部的那條邊容量改成inf就好
第三問:
直接dp算了......當然你也可以再改改邊,跑網路流,不過估計沒有dp快
code:
1 #include2 #include3 #include4 #include5#define inf 1000000000
6using
namespace
std;
7 inline int
read()
13while(ch>='
0'&&ch<='
9') re=(re<<1)+(re<<3)+ch-'
0',ch=getchar();
14return
re;15}16
int n,m,cnt,ans,flow,tot,first[10010],x[25][25],id[25][25
];17
int dis[10010],pre[10010],path[10010
];18
struct
edgea[100010
];21 inline void add(int u,int v,int w,int
cap);first[u]=cnt;
24 a[++cnt]=(edge);first[v]=cnt;25}
26void
init()
30int spfa(int s,int
t)46}47
}48return ~pre[t];49}
50 inline int _min(int l,int r)
51int mcmf(int s,int
t)62}63
}64intmain()
72//
t173
init();
74for(i=1;i<=n;i++) add(0,id[1][i],0,1
);75
for(i=1;i<=m;i++)
78for(i=1;i)83}
84for(i=1;i<=n+m-1;i++) add(id[m][i]+tot,(tot<<1)+1,-x[m][i],1
);85 mcmf(0,(tot<<1)+1
);86 printf("
%d\n
",-ans);
87//
t288
init();
89for(i=1;i<=n;i++) add(0,id[1][i],0,1
);90
for(i=1;i<=m;i++)
93for(i=1;i)98}
99for(i=1;i<=n+m-1;i++) add(id[m][i]+tot,(tot<<1)+1,-x[m][i],inf);
100 mcmf(0,(tot<<1)+1
);101 printf("
%d\n
",-ans);
102//
t3103
init();
104for(i=1;i<=n;i++) add(0,id[1][i],0,1
);105
for(i=1;i<=m;i++)
108for(i=1;i)
113}
114for(i=1;i<=n+m-1;i++) add(id[m][i]+tot,(tot<<1)+1,-x[m][i],inf);
115 mcmf(0,(tot<<1)+1
);116 printf("
%d",-ans);
117 }
網路流24題 數字梯形問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這...
網路流 24 題 數字梯形
題目描述 給定乙個由 n n n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m m m 個數字。從梯形的頂部的 m m m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。分別遵守以下規則 從梯形的頂至底的 m m m 條路徑互不相交 從梯形的頂至底的 m m ...
網路流24題 數字梯形問題 費用流
洛谷傳送門 loj傳送門 勞資把 spfa 裡 cost 陣列初始化從 1 改成 inf 就特麼 a 了,梯形裡有負數,浪費了半個多小時,心態都崩了 問題難度好像是反過來的 源點向第一排的點都流量為 1 費用為 0 的邊,最後一排的點向匯點連流量為 1 費用為 0 的邊 第三問點點之間流量 inf ...