I-Interval 2020牛客多校训练营第2场

https://ac.nowcoder.com/acm/contest/5667/I

[1,2]     ..     [1,n-1]   [1,n]

           [ 2,3]    ..       [2,n]

                               [n-1,n]

这样一个网格图,给出部分边,没给出的边就取正无穷,要求一个这样的最小割

然后平面图转对偶图,看dis[T]是否小于正无穷,则有解

#include
using namespace std;
typedef long long ll;
typedef pair p;

const int maxl=510;
const ll inf=1e18;

int n,m,tot,T;
int a[maxl][maxl];
ll lft[maxl][maxl],dwn[maxl][maxl];
ll dis[maxl*maxl];
struct ed{int to;ll l;};
vector e[maxl*maxl];
char s[2];
bool in[maxl*maxl];
priority_queue,greater

>q; inline void add(int u,int v,ll l) { e[u].push_back(ed{v,l}); e[v].push_back(ed{u,l}); } inline void prework() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) lft[i][j]=inf,dwn[i][j]=inf; int l,r,dir,c; for(int i=1;i<=m;i++) { scanf("%d%d%s%d",&l,&r,s,&c); if(s[0]=='L') dwn[l][r]=c; else lft[l][r]=c; } tot=1; for(int i=1;i<=n;i++) for(int j=n;j>=i+1;j--) a[i][j]=++tot; T=tot+1; for(int j=n;j>=2;j--) add(1,a[1][j],lft[1][j]); for(int i=1;i<=n-1;i++) add(a[i][n],T,dwn[i][n]); for(int i=1;i<=n-3;i++) for(int j=n;j>=i+3;j--) add(a[i][j],a[i][j-1],dwn[i][j-1]); for(int i=1;i<=n-3;i++) for(int j=n;j>=i+3;j--) add(a[i][j],a[i+1][j],lft[i+1][j]); for(int i=1;i<=n-1;i++) { if(i>1) add(a[i][i+1],a[i-1][i+1],lft[i][i+1]); if(i

 

你可能感兴趣的:(平面图)