HDU1534差分约束
Posted hesorchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1534差分约束相关的知识,希望对你有一定的参考价值。
题目
思路
S[1,n] 表示第i个零件的开始时间
S[n+1,2*n] 表示第i-n个零件的结束时间
S[i+n]-s[i]=T[i],等于号可以化为小于等于、大于等于两个约束条件。
其他约束条件按题目来就行。求最小值,用最长路。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
struct node
{
int v, w;
};
vector<node> edge[N];
int n;
void add(int u, int v, int w)
{
edge[u].emplace_back(node{v, w});
}
int dis[N];
int a[N];
int vis[N];
int cnt[N];
void init(int n)
{
for (int i = 0; i <= 2 * n; i++)
dis[i] = -0x3f3f3f3f, cnt[i] = vis[i] = 0;
for (int i = 0; i <= 2 * n; i++)
edge[i].clear();
}
int CA;
bool spfa(int beg)
{
queue<int> q;
q.push(beg);
dis[beg] = 0;
while (q.size())
{
int u = q.front();
q.pop();
vis[u] = 0;
for (auto it : edge[u])
{
int v = it.v;
int w = it.w;
if (dis[v] < dis[u] + w)
{
dis[v] = dis[u] + w;
if (++cnt[v] > 2 * n)
return 0;
if (!vis[v])
{
q.push(v);
vis[v] = 1;
}
}
}
}
return 1;
}
int main()
{
while (cin >> n && n)
{
init(n);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
/*
S[1,n] 表示第i个零件的开始时间
S[n+1,2*n] 表示第i-n个零件的结束时间
*/
add(i + n, i, -a[i]);
add(i, i + n, a[i]);
}
string temp;
while (cin >> temp)
{
if (temp[0] == '#')
break;
int x, y;
cin >> x >> y;
if (temp == "FAS") //Ex>=Sy
add(y, x + n, 0);
else if (temp == "FAF") //Ex>=Sy
add(y + n, x + n, 0);
else if (temp == "SAF") //Ex>=Sy
add(y + n, x, 0);
else if (temp == "SAS")
add(y, x, 0);
}
for (int i = 1; i <= 2 * n; i++)
add(0, i, 0);
bool flag = spfa(0);
printf("Case %d:\\n", ++CA);
if (flag)
{
for (int i = 1; i <= n; i++)
cout << i << ' ' << dis[i] << endl;
}
else
puts("impossible");
puts("");
}
return 0;
}
以上是关于HDU1534差分约束的主要内容,如果未能解决你的问题,请参考以下文章