| ||||||||||
| 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!!天理啊。。。。In Reply To:哪位好心人帮我看一下,检查了很长时间都还是wa!!天理啊。。。。 Posted by:zhoubizhang at 2010-04-25 15:29:23 > #include<stdio.h>
> #include<string.h>
> #define MM 250
> const int inf = 1 << 30;
> int K,C,M,z;
> int cur[MM],pre[MM],dis[MM][MM],Dis[MM],gap[MM];
> int maze[MM][MM];
> int min(int a,int b)
> {
> return a==-1||b>a?b:a;
> }
> void Froyd()
> {
> int u,w,v,n=z;
> for(u=1;u<=n;u++)
> for(v=1;v<=n;v++)
> if(dis[v][u]!=inf)
> {
> for(w=1;w<=n;w++)
> if(dis[v][u]+dis[u][w]<dis[v][w])
> dis[v][w]=dis[v][u]+dis[u][w];
> }
> return ;
> }
> void build_graph(int max)
> {
> int n=z+1,i,j;
> memset(maze,0,sizeof(maze));
> for(i=1;i<=K;i++)
> {
> maze[i][n]=M;
> }
> for(i=K+1;i<=z;i++)
> {
> maze[0][i]=1;
> }
> for(i=K + 1; i <= z; i ++)
> for(j = 1; j <= K; j ++)
> if(dis[i][j] <= max)//注意现在的dis已不是先前的dis现在以为最短路径
> maze[i][j] = 1;
> return ;
> }
> int sap(int s,int t,int nodenum)
> {
> memset(cur,0,sizeof(cur));
> memset(pre,0,sizeof(pre));
> memset(Dis,0,sizeof(Dis));
> memset(gap,0,sizeof(gap));
> int u=pre[s]=s,maxflow=0,aug=-1;
> int v;
> gap[0]=nodenum;
> while(Dis[s]<nodenum)
> {
> loop:
> for(v=cur[u];v<nodenum;v++)
> {
> if(maze[u][v]&&Dis[u]==Dis[v]+1)
> {
> aug=min(aug,maze[u][v]);
> pre[v]=u;
> u=cur[u]=v;
> if(v==t)
> {
> maxflow+=aug;
> for(u=pre[v];v!=s;v=u,u=pre[u])
> {
> maze[u][v]-=aug;
> maze[v][u]+=aug;
> }
> aug=-1;
> }
> goto loop;
> }
> }
>
> int mindis=nodenum-1;
> for(v=0;v<nodenum;v++)
> {
> if(maze[u][v]&&mindis>Dis[v])
> {
> cur[u]=v;
> mindis=Dis[v];
> }
> }
>
> if((--gap[Dis[u]])==0)
> break;
> gap[Dis[u]=mindis+1]++;
> u=pre[u];
> }
> return maxflow;
> }
> int main()
> {
> int i,j,left,right;
> scanf("%d%d%d",&K,&C,&M);
> z=K+C;
> for(i=1;i<=z;i++)
> {
> for(j=1;j<=z;j++)
> {
> scanf("%d",&dis[i][j]);
> if(dis[i][j]==0)
> dis[i][j]=inf;
> }
> }
> Froyd();
> left=0,right=10000;
> while(left<right)
> {
> int mid=(left+right)>>1;
> build_graph(mid);
> int temp=sap(0,z+1,z+2);
> if(temp>=C)right=mid;
> else left=mid+1;
> }
> printf("%d\n",right);
> return 0;
> }
inf = 1 << 30; 开大了吧!最短路要相加的
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator