标签:null iso find save others symbols ota seq ott
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1564 Accepted Submission(s): 727
//运行spfa判断是否存在负环。注意题目中是b-a>c,b-a<c,差分约束要求>=或<=,因此要转化成b-a>=c+1,b-a<=c-1; //可以都转换成>=的形式求最长路或<=的形式求最短路。加一个公共源点,每个点到他的距离为0。 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int maxn=102,inf=0x7fffffff; struct node { int to,next,val; } edge[maxn*4];//! int mark[maxn],head[maxn],tot,dis[maxn],n,m,cnt[maxn]; void add(int a,int b,int c) { edge[tot].to=b; edge[tot].next=head[a]; edge[tot].val=c; head[a]=tot++; } bool spfa(int s) { for(int i=0;i<=n+1;i++) dis[i]=-inf; memset(mark,0,sizeof(mark)); memset(cnt,0,sizeof(cnt)); queue<int>q; dis[s]=0; mark[s]=1; cnt[s]++; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); mark[u]=0; for(int i=head[u]; i!=-1; i=edge[i].next) { int v=edge[i].to; if(dis[v]<dis[u]+edge[i].val) { dis[v]=dis[u]+edge[i].val; if(!mark[v]) { cnt[v]++; if(cnt[v]>n+1) return false;//加上公共源点有n+2个点,入队n+2次时存在负环。 q.push(v); mark[v]=1; } } } } return true; } int main() { while(scanf("%d",&n)&&n){ scanf("%d",&m); char ch[5]; int a,b,c; memset(head,-1,sizeof(head)); tot=0; for(int i=0;i<m;i++){ scanf("%d%d%s%d",&a,&b,ch,&c); if(ch[0]==‘g‘) add(a-1,b+a,c+1); else add(b+a,a-1,1-c); } for(int i=0;i<=n;i++) add(n+1,i,0); if(spfa(n+1)) printf("lamentable kingdom\n"); else printf("successful conspiracy\n"); } return 0; }
si,ni,gt/lt,ki表示a[si]+a[si+1]+......+a[si+ni]>/<Ki;问满足这m个条件的序列存在否。
标签:null iso find save others symbols ota seq ott
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6361382.html