板子
差分约束spfa,求最长路模板,
以Codeforces 67A Partial Teacher为例
多组样例时,应将vis[]数组清空
题目保证无环时,才能使用此代码
否则,最长路应先判断无正环,最短路应先判断无负环
若有对应环,则不等式约束无解
代码
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<int,int> P;
const int INF=0x3f3f3f3f;
const int N=1e3+5;
char s[N];
int n,dis[N];
vector<P>E[N];
bool vis[N];
void add(int u,int v,int w)
{
E[u].push_back(P(v,w));
}
void spfa(int s)//a-b>=c,add(b,a,c)
{
for(int i=1;i<=n;++i)
dis[i]=-INF;//最长路
dis[s]=0;
queue<int>q;
q.push(s);
vis[s]=1;//当前在队列中
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<E[u].size();++i)
{
int v=E[u][i].fi,w=E[u][i].se;
if(dis[v]<dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
}
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<n;++i)
{
if(s[i]=='L')add(i+1,i,1);
else if(s[i]=='R')add(i,i+1,1);
else add(i,i+1,0),add(i+1,i,0);
}
for(int i=1;i<=n;++i)
add(0,i,1);//dis[i]>=1
spfa(0);
for(int i=1;i<=n;++i)
printf("%d%c",dis[i]," \n"[i==n]);
return 0;
}