問題描述:給出ai,ni,op字串(分別表示>和<),ci,表示S(ai)+S(ai+1)+....+S(ai+ni)>/<ci
問是否存在這樣的S
問題解法:差分約束,超杯具,我竟然把S(ai)+S(ai+1)+....+S(ai+ni)表示成S(ai+ni)-S[ai],很明顯這是錯的,應該是:
S(i)表示i之前(不含i)的連續和,所以上式應表示成S(ai+ni+1)-S(ai)
另外由於本題是嚴格的< 和>,所以x-y<c要表示成w(y,x)=c-1;
至於其他的照打便是了
#include<cstdio><br />#include<cstdlib><br />#include<cstring><br />#include<queue><br />#include<cmath><br />#define INF 200000000<br />using namespace std;<br />const int MAXN=500*500;<br />int n,m,u[MAXN],v[MAXN],first[MAXN],w[MAXN],next[MAXN],d[MAXN];<br />//int bellman_ford()</p><p>void add_vertice()<br />{<br /> int& e=m;<br /> for(int i=1;i<=n+1;i++)<br /> {<br /> u[e]=n+2;<br /> v[e]=i;<br /> w[e]=0;<br /> next[e]=first[u[e]];<br /> first[u[e]]=e++;<br /> }<br />}//Notes: add 0 to the Graph<br />bool bellman_ford()//Notes:is spfa<br />{<br /> //printf("###/n");<br /> bool inq[MAXN];<br /> int inqnum[MAXN];<br />//Notes:is the number of the vertice entering<br />//the queue<br /> queue<int > q;</p><p> for(int i=1;i<=n+1;i++ ) d[i]=INF;<br /> d[n+2]=0;<br /> q.push(n+2);<br /> memset(inq,0,sizeof(inq));<br /> memset(inqnum,0,sizeof(inqnum));<br /> inqnum[n+2]=1;<br /> while(!q.empty())<br /> {<br /> int x=q.front();q.pop();<br /> inq[x]=false;<br /> for(int e=first[x];e!=-1;e=next[e])<br /> if(d[v[e]]>d[x]+w[e])<br /> {<br /> d[v[e]]=d[x]+w[e];<br /> if(!inq[v[e]])<br /> {<br /> inqnum[v[e]]++;<br /> if(inqnum[v[e]]>n+2) return false;<br /> inq[v[e]]=true;<br /> q.push(v[e]);<br /> }<br /> }<br /> }<br /> return true;<br />}<br />int main()<br />{<br /> int a,b,c;<br /> char fir,sec;<br /> while(scanf("%d",&n)==1 && n)<br /> {<br /> memset(first,-1,sizeof(first));<br /> scanf("%d",&m);<br /> for(int e=0;e<m;e++)<br /> {<br /> // scanf("%d%d%c%c %d",&a,&b,&fir,&sec,&c);<br /> scanf("%d%d",&a,&b);<br /> getchar();<br /> scanf("%c%c",&fir,&sec);<br /> scanf("%d",&c);<br /> // scanf("%d%d%c%c%d",);<br /> // printf("%d%d%c%c%d/n",a,b,fir,sec,c);<br /> if(fir=='g' && sec=='t')<br /> {<br /> u[e]=b+a+1;<br /> v[e]=a;<br /> w[e]=-c-1;<br /> next[e]=first[u[e]];<br /> first[u[e]]=e;<br /> }<br /> else<br /> {<br /> u[e]=a;<br /> v[e]=b+a+1;<br /> w[e]=c-1;<br /> next[e]=first[u[e]];<br /> first[u[e]]=e;<br /> }<br /> }<br /> add_vertice();<br /> //printf("####3/n");<br /> bool ans=bellman_ford();<br /> if(ans) printf("lamentable kingdom/n");<br /> else printf("successful conspiracy/n");<br /> }<br /> // system("pause");<br /> return 0;</p><p>}<br />