http://poj.org/problem?id=1275
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 2000
using namespace std;
const int inf=<<;
int r[],t[maxn],s[maxn],dis[maxn];
int n,e;
int sum;
struct node
{
int u,v,w;
}p[maxn];
void add(int u,int v,int w)
{
p[e].u=u;
p[e].v=v;
p[e++].w=w;
}
bool bellman_ford()
{
for(int i=; i<=; i++) dis[i]=inf;
dis[]=;
bool flag;
for(int i=; i<=; i++)
{
flag=false;
for(int j=; j<e; j++)
{
if(dis[p[j].v]>dis[p[j].u]+p[j].w)
{
dis[p[j].v]=dis[p[j].u]+p[j].w;
flag=true;
}
}
if(!flag) break;
}
if(flag) return false;
else return true;
}
void buil(int x)
{
e=;
int j;
for(j=; j<=; j++)
{
int i=(j+)%;
if(i>j)
{
add(i,j,-r[i]);
}
else if(i<j)
{
add(i,j,x-r[i]);
}
}
add(,,-x);
} void bear(int r,int l)
{
int low=r,high=l;
while(low<=high)
{
//printf("%d\n",sum);
int mid=(low+high)/;
buil(mid);
if(bellman_ford())
{
sum=mid;
high=mid-;
}
else
low=mid+;
}
} int main()
{
int m,x;
scanf("%d",&m);
while(m--)
{
for(int i=; i<=; i++)
{
scanf("%d",&r[i]);
}
scanf("%d",&n);
memset(t,,sizeof(t));
for(int i=; i<n; i++)
{
scanf("%d",&x);
t[x+]++;
}
e=;
for(int i=; i<=; i++)
{
add(i-,i,t[i]);
add(i,i-,);
}
sum=-;
bear(,n);
if(sum==-)
printf("No Solution\n");
else
printf("%d\n",sum);
}
return ;
}