RT,查分约束,为什么T了
#include<bits/stdc++.h>
#define INF 0x7ffffff
using namespace std;
int v[1005],nex[1005],w[1005];
int inq[1005],done[1005],dis[1005],first[1005],da[1005];
int cnt;
void add(int x,int y,int z)
{
v[cnt]=y;
w[cnt]=z;
nex[cnt]=first[x];
first[x]=cnt++;
}
int SPFA(int s,int n)
{
int i;
for(i=0;i<n;i++)
dis[i]=-INF;
memset(inq,0,sizeof(inq));
memset(done,0,sizeof(done));
queue<int>q;
q.push(s);
dis[s]=0;
while(!q.empty()){
int x=q.front();q.pop();
inq[x]=0;
for(int e=first[x];~e;e=nex[e])
if(dis[v[e]]<dis[x]+w[e]){
dis[v[e]]=dis[x]+w[e];
if(!inq[v[e]])
{
q.push(v[e]);
inq[v[e]]=1;
if(++done[v[e]]>n)return 1;
}
}
}
return 0;
}
int main()
{
int n,m,cas=0;
char cs[4];
while(~scanf("%d",&n)&&n){
cas++;
cout<<"Case "<<cas<<":\n";
int a,b;
memset(first,-1,sizeof(first));
memset(nex,-1,sizeof(nex));
cnt=0;
int i;
for(i=1;i<=n;i++){
cin>>da[i];
add(0,i,0);
}
while(~scanf("%s",cs)&&cs[0]!='#'){
cin>>a>>b;
if(cs[0]=='F'){
if(cs[2]=='F')
add(b,a,da[b]-da[a]);
else
add(b,a,-da[a]);
}
else {
if(cs[2]=='F')
add(b,a,da[b]);
else
add(b,a,0);
}
}
if(SPFA(0,n+1))
cout<<"impossible\n";
else
for(i=1;i<=n;i++)
cout<<i<<" "<<dis[i]<<endl;
cout<<endl;
}
return 0;
}