先講一下這道題的邊相交指的是連續兩次走到同乙個點。
第一問:如果點不想交顯然邊也不相交,所以我們只要把每個點拆成兩個點,中間連流量為1,費用為這給點的貢獻的邊,s連第一行,最後一行連t,第i行連第i+1行,費用為0,流量為inf,最大費用最大流跑一發就行了。
第二問:每個點可以走多次,但是每條邊只能走一次,所以把拆點省略,行與行之間連的流量變為1就行了,至於貢獻,把這個點的貢獻設為入邊的費用就行了,s到第一行的費用為第一行的貢獻,流量仍為1,最後一行到t的費用為0,注意流量要改為inf,因為每個點可以作為終點多次,因為貢獻在倒數第二行流過來的時候算過了。
第三問:可以xjb流,所以把流量改為inf就行了,但是s到第一行的流量仍為1.
#include
#include
#include
#include
#include
#define ll long long
#define inf (2139062143)
#define n (105)
template void read(t&t)
do while (isdigit(p));
if (!fl) t=-t;
}int
m,n,tot,s,t,h,t,all,ans;
intmap[n][n],a[n*n],f[n*n],fare[n*n],nxt[n*n],head[n*n],q[n*n
<<2],dis[n*n],from[n*n];
bool vis[n*n];
inline void add(int
x,int
y,int z,int t)
inline int spfa()}}
vis[u]=0;
}return dis[t];
}int get(int
x,int
y)inline void work1()
for (int i=1;ifor (int j=1;j<=m+i-1;j++)
}for (int j=1;j<=m+n-1;j++)
while (spfa()!=dis[0])
} printf("%d\n",ans);
}void work2()
for (int i=1;ifor (int j=1;j<=m+i-1;j++)
}for (int j=1;j<=m+n-1;j++)
while (spfa()!=dis[0])
} printf("%d\n",ans);
}void work3()
for (int i=1;ifor (int j=1;j<=m+i-1;j++)
}for (int j=1;j<=m+n-1;j++)
while (spfa()!=dis[0])
} printf("%d\n",ans);
}int main()
}all=(m
*2+n-1)*n/2;
work1();
work2();
work3();
return
0;}
網路流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 ...