前言
这才多久,作业就这么多了
传送门 :
思路
差分约束 :
X i > = X j + C 1 那 么 我 们 可 以 建 立 一 条 从 i 到 j 的 边 边 权 为 C i X_i >= X_j+C_1那么我们可以建立一条从i到j的边边权为C_i Xi>=Xj+C1那么我们可以建立一条从i到j的边边权为Ci
根据这个性质我们只需要提炼出 题目中的不等式最后建图跑 SPFA或者DIJ即可
如果是答案的最小值那么我们需要跑一遍最长路
否则我们需要跑一遍最短路
CODE
// Problem: 糖果
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/1171/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
// Problem: String
// Contest: HDOJ
// URL: http://acm.hdu.edu.cn/showproblem.php?pid=4821
// Memory Limit: 32 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
// Problem: P2738 [USACO4.1]���ʻ�·Fence Loops
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2738
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define px first
#define py second
#define pb push_back
typedef pair<int,int> pii;
int dxy[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
const int N = 1e5+10;
struct union_find_set{
int n,p[N];
void init(int N)
{
n = N;
for(int i=1;i<=n;i++)
p[i] = i ;
}
int find(int x)
{
if(p[x]!=x)return p[x] =find(p[x]);
return p[x];
}
bool set_union(int u,int v)
{
return (u = find(u)) ==(v == find(v))?false : p[v] = u ;
}
}ufs;
struct String_hash{
int h[N],base[N];
int seed = 31;
ll BKDRHash(int l,int r)
{
return h[r] - h[l-1] * base[r-l+1];
}
void init()
{
for(int i =1;i<=N;i++)
base[i] = base[i-1]*seed;
}
void hash(string s)
{
int len = s.size();
h[0]=0;
for(int i=1;i<=len;i++)
h[i] = h[i-1]*seed + s[i] - 'a';
}
}SH;
struct node
{
int to ,val;
};
vector<node> g[N];
int n,m,t;
int dist[N],st[N];
int cnt[N];
void cal()
{
}
void spfa()
{
memset(dist,-0x3f,sizeof dist);
queue<int> q;
dist[0] = 0 ;
q.push(0);
//建立虚拟源点
for(int i=1;i<=n;i++)
g[0].pb({i,1});
while(!q.empty())
{
int t = q.front();
q.pop();
st[t] = 0;
for(auto x : g[t])
{
int j = x.to;
int w = x.val;
if(dist[j]<dist[t]+w)
{
dist[j] = dist[t] +w;
cnt[j] = cnt[t]+1;
if(cnt[j]>=n+1)
{
cout<<-1<<endl;
return;
}
if(!st[j])
{
st[j] = 1;
q.push(j);
}
}
}
}
ll res = 0;
for(int i=1;i<=n;i++)
res+=dist[i];
cout<<res<<endl;
return;
}
void solve()
{
cin>>n>>m;
while(m -- )
{
int op,a,b;
cin>>op>>a>>b;
if(op == 1)
g[a].pb({b,0}),g[b].pb({a,0});
else if(op == 2)
g[a].pb({b,1});
else if(op == 3)
g[b].pb({a,0});
else if(op == 4)
g[b].pb({a,1});
else if(op == 5)
g[a].pb({b,0});
}
spfa();
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}