| ||||||||||
| 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 | |||||||||
Re:我WA了why?我是用dijstra方法写出的费用流2195能过这道题却???哪位大牛看一下撒In Reply To:我WA了why?我是用dijstra方法写出的费用流2195能过这道题却???哪位大牛看一下撒 Posted by:0506010237 at 2008-08-07 13:38:08 > #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