标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7651 | Accepted: 2886 |
Description
Input
Output
Sample Input
1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 0 23 22 1 10
Sample Output
1
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #define INF -1000000000 5 using namespace std; 6 int r[25],t[25]; 7 int cnt,fir[2010],nxt[2010],to[2010],val[2010]; 8 void addedge(int a,int b,int v) 9 { 10 nxt[++cnt]=fir[a]; 11 fir[a]=cnt;to[cnt]=b; 12 val[cnt]=v; 13 } 14 int n,ans; 15 int dis[30],in[30],vis[30],q[50010]; 16 bool Spfa() 17 { 18 int S=0,f=1,b=1; 19 for(int i=0;i<=24;i++) 20 dis[i]=INF; 21 memset(in,0,sizeof(in)); 22 memset(vis,0,sizeof(vis)); 23 24 q[b++]=S; 25 dis[S]=0; 26 in[S]++; 27 vis[S]=1; 28 while(f<b){ 29 int node=q[f++];vis[node]=false; 30 for(int i=fir[node];i;i=nxt[i]) 31 if(dis[to[i]]<dis[node]+val[i]){ 32 dis[to[i]]=dis[node]+val[i]; 33 if(!vis[to[i]]){ 34 if(++in[to[i]]>n) 35 return false; 36 q[b++]=to[i]; 37 vis[to[i]]=true; 38 } 39 } 40 } 41 return dis[24]==ans; 42 } 43 44 void Build() 45 { 46 memset(fir,0,sizeof(fir));cnt=0; 47 for(int i=8;i<=24;i++) 48 addedge(i-8,i,r[i]); 49 50 for(int i=1;i<=7;i++) 51 addedge(i+16,i,r[i]-ans); 52 for(int i=0;i<24;i++){ 53 addedge(i+1,i,-t[i]); 54 addedge(i,i+1,0); 55 } 56 addedge(0,24,ans); 57 } 58 59 void Solve() 60 { 61 int r=0,h=n+1; 62 while(h-r>1) 63 { 64 ans=(r+h)>>1; 65 Build(); 66 if(Spfa()) 67 h=ans; 68 else 69 r=ans; 70 } 71 if(h==n+1) 72 printf("No Solution\n"); 73 else 74 printf("%d\n",h); 75 } 76 77 int main(){ 78 int T;int x; 79 scanf("%d",&T); 80 while(T--) 81 { 82 for(int i=1;i<=24;i++) 83 scanf("%d",&r[i]); 84 scanf("%d",&n); 85 memset(t,0,sizeof(t)); 86 for(int i=1;i<=n;i++){ 87 88 scanf("%d",&x); 89 ++t[x]; 90 } 91 Solve(); 92 } 93 return 0; 94 }
图论(差分约束系统):POJ 1275 Cashier Employment
标签:
原文地址:http://www.cnblogs.com/TenderRun/p/5272103.html