差分約束合集

2021-06-22 16:16:33 字數 4371 閱讀 9313

一開始沒看題目中的<=> 符號,各種錯誤。實際上可化簡為典型的判斷差分約束有無解的問題,需要用到spfa。

#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

const int maxn = 305;

int n, res, tt = 1000;

int mmp[maxn];

char str[maxn][maxn];

struct node;

vectorhead[maxn];

void dfs(int u, int c)

} else

}}int qq[maxn*maxn], bg, ed, vis[maxn], dis[maxn], cnt[maxn];

int spfa()

}

} }return 1;

}int main()

} memset(mmp, 0, sizeof mmp);

res = 1;

for (int i = 0; i< n; ++i)

if(res == 1)

else

}else

else}}

}for (int i = 0; i< n; ++i)

if (spfa()) puts("yes");

else puts("no");

} else puts("no");

} return 0;

}

典型的差分約束,需要注意的是因為涉及到求點之間距離,所以無需新增乙個源點使其與所有定點相連且邊權均為0。

#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

const int maxn = 1005;

const int inf = 1<<30;

struct eg;

vectore[maxn];

int n, vis[maxn], dis[maxn], cnt[maxn];

int q[maxn*maxn], bg, ed;

int spfa()

}} }

if(dis[n] == inf) return -2;

return dis[n];

}int main()

for (int i= 0; i< x; ++i)

for (int i = 0; i< y; ++i)

printf("%d\n", spfa());

} return 0;

}

沒什麼好說的,需要加個源點

#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

const int maxn = 100005;

const int inf = 1<<30;

struct eg;

vectore[maxn];

int n, vis[maxn], dis[maxn], cnt[maxn], last[maxn];

int q[maxn*10], bg, ed;

int spfa()

}} }

return 1;

}char ss[20];

int main()

while(1)

else if ( strcmp(ss, "faf") == 0)

else if (strcmp(ss, "saf") == 0)

else // sas

}if (!spfa()) puts("impossible");

else

if (i & 1)

}if (!k)

}} }

return 0;

}

差分約束的核心是找出所有符合條件的變數兩兩之間的關係。

算是好題,如何把多元關係式轉化為二元不等式廢了不少功夫

#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

const int maxn = 50;

const int inf = 1<<30;

struct eg;

vectore[maxn];

int n, vis[maxn], dis[maxn], cnt[maxn];

int q[10000], bg, ed;

int ready[maxn], need[maxn];

int spfa(int num)

bg = ed = 0;

int st = 24;

for (int i = 0; i<= 30; ++i) vis[i]=0, dis[i]=inf, cnt[i]=0;

vis[st] = 1, dis[st] = 0, cnt[st]++, q[ed++]=st;

while (bg < ed)

}} }

return 1;

}void build()

for (int i= 1; i< 24; ++i)

for (int i = 8; i< 24; ++i)

for (int i = 0; i< 24; ++i) }

void bnry_sch()

else low = mid+1;

for (int i = 0; i<= 7; ++i)

}if (res == -1) puts("no solution");

else printf("%d\n", res);

}int main()

scanf("%d", &n);

for (int i= 0; i < n; ++i)

build();

bnry_sch();

} return 0;

}

對時間卡的比較嚴(用到dfs的spfa),加入源點然後判斷是否有解。
l <= cij * ai / bj<= u
l/cij <= ai / bj<= u/cij

l' <= ai / bj<= u'

log(l') <= log(ai / bj)<= log(u')

#include#include#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

const int maxn = 810;

struct node

ee[maxn*maxn];

int head[maxn], ne;

int n, m;

double dis[maxn], l, u;

bool vis[maxn], instk[maxn];

void add(int u, int v, double w)

bool spfa(int u)

}instk[u] = 0;

return 1;

}bool judge()

for (int i = 1; i<= n+m; ++i)

}return 1;}/*

l <= cij * ai / bj<= u

l/cij <= ai / bj<= u/cij

l' <= ai / bj<= u'

log(l') <= log(ai / bj)<= log(u')

*/double da[405][405];

int main()

}if (!judge()) puts("no");

else puts("yes");

}return 0;

}

POJ3169差分約束 SPFA 差分約束

思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...

分糖果 差分約束

description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...

差分約束系統

差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...