题意:给出FAS A-B>=-wa FAF a-b>=wb-wa SAS a-b>=0 SAF a-b>=wb问是否存在可能,若可能输出最短时间
思路:
A-B>=C的形式,询问最小解, 构造最长路的形式
FAS: b->a ==-wa
FAF:b->a==wb-wa
SAS: b-.>a=0
SAF b->a=wb
ps:第一次写的DEQUE优化,炸了???
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
using namespace std;
const int maxn=10005;
vector<pair<int ,int > > vec[maxn];
int vis[maxn];
int info[maxn];
int dis[maxn];
int w[maxn];
const int inf=0x3f3f3f3f ;
int n,m;
int spfa(int st)
{
memset(info,0,sizeof(info));
memset(vis,0,sizeof(vis));
queue<int>q;
for(int i=1;i<=n;i++)
{
vis[i]=1,dis[i]=0,info[i]=1;
q.push(i);
}
int u;
while(!q.empty())
{
u=q.front();
q.pop();
vis[u]=0;
for(int i=0; i<vec[u].size(); i++)
{
int v=vec[u][i].first;
int w=vec[u][i].second;
if( dis[v] < w+dis[u] )
{
dis[v]=w+dis[u];
if(!vis[v])
{
info[v]++;
vis[v]=1;
q.push(v);
if(info[v]>n)
{
return 0;
}
}
}
}
}
return 1;
}
int main()
{
int cs=0;
while(~scanf("%d",&n),n )
{
if(cs)
printf("\n");
for(int i=0; i<=maxn; i++)
vec[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
char s[5];
while(~scanf("%s",s))
{
int u,v;
if(s[0]=='#')
break;
scanf("%d%d",&u,&v);
if(s[0]=='F'&&s[1]=='A'&&s[2]=='S')
{
vec[v].push_back(make_pair(u,-w[u]));
}
else if(s[0]=='F'&&s[1]=='A'&&s[2]=='F')
{
vec[v].push_back(make_pair(u,w[v]-w[u]));
}
else if(s[0]=='S'&&s[1]=='A'&&s[2]=='S')
{
vec[v].push_back(make_pair(u,0));
}
else
{
vec[v].push_back(make_pair(u,w[v]));
}
}
printf("Case %d:\n",++cs);
if(spfa(1))
{
for(int i=1;i<=n;i++)
{
printf("%d %d\n",i,dis[i]);
}
}
else
printf("impossible\n");
}
return 0;
}