Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我WA了why?我是用dijstra方法写出的费用流2195能过这道题却???哪位大牛看一下撒#include<iostream> using namespace std; const int maxs=INT_MAX/10; int n,m,k,sum,len; int supply[120][60]; int stock[120][60]; bool visit[120],flat; int u,c[120],pre[120],f[120]; struct{ int cost,c; int f,rf; }num[120][120]; int mins(int a,int b){ return a<b?a:b; } int feiyong(int t){ for(int i=1;i<len;i++){ visit[i]=0; c[i]=num[0][i].cost; f[i]=num[0][i].f; pre[i]=0; } visit[0]=1;pre[0]=-1; while(true){ int min=maxs; for(int j=1;j<len;j++) if(visit[j]==0 && c[j]<min){ min=c[j]; u=j; } if(min==maxs) return min; visit[u]=1; if(u==len-1){ int w1=pre[u],w2=u; while(w1!=-1){ if(num[w1][w2].rf>0){ num[w1][w2].rf=num[w1][w2].rf-f[u]; supply[w2][t]+=f[u]; stock[w1][t]+=f[u]; } else{ if(w1!=0 && w2!=len-1){ num[w2][w1].rf=num[w2][w1].rf+f[u]; supply[w1][t]-=f[u]; stock[w2][t]-=f[u]; } } w2=w1;w1=pre[w1]; } return f[u]*c[u]; } for(int w=1;w<len;w++){ if(visit[w]==0){ if(num[u][w].rf>0 && c[w]>c[u]-num[w][u].c){ c[w]=c[u]-num[w][u].c; f[w]=f[u]<=num[u][w].rf?f[u]:num[u][w].rf; pre[w]=u; } else if(c[w]>c[u]+num[u][w].cost){ c[w]=c[u]+num[u][w].cost; f[w]=f[u]<=num[u][w].f?f[u]:num[u][w].f; pre[w]=u; } } } } } void startfei(int t){ int v=0; while(true){ for(int i=1;i<=n;i++) for(int j=n+1;j<=n+m;j++) num[i][j].f=mins(supply[i][t],stock[j][t]); for(int i=0;i<len;i++) for(int j=0;j<len;j++) if(num[i][j].f==0) num[i][j].cost=maxs; else num[i][j].cost=num[i][j].c; v=feiyong(t); if(v==maxs) break; sum+=v; } } void input(){ int v; flat=false; sum=0; len=n+m+2; for(int i=1;i<=n;i++) for(int j=0;j<k;j++) scanf("%d",&supply[i][j]); for(int i=n+1;i<=n+m;i++) for(int j=0;j<k;j++) scanf("%d",&stock[i][j]); for(int t=0;t<k;t++){ memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) for(int j=n+1;j<=n+m;j++) scanf("%d",&num[i][j].c); for(int i=1;i<=n;i++) num[0][i].f=maxs; for(int i=n+1;i<=n+m;i++) num[i][n+m+1].f=maxs; if(!flat){ startfei(t); for(int i=1;i<=n;i++) if(supply[i][t]!=0){flat=true; break;} } } } int main() { while(true){ scanf("%d%d%d",&n,&m,&k); if(n==0 && m==0 && k==0) break; input(); if(flat) printf("-1\n"); else printf("%d\n",sum); } system("pause"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator