一開始沒看題目中的<=> 符號,各種錯誤。實際上可化簡為典型的判斷差分約束有無解的問題,需要用到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/cijl' <= 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 ...