因为本人不会在codeforces上面把代码换行神马的,所以在这里加个链接,一般是错误的代码,目前还没有发表什么文章,所以大家请跳过这篇文章。
【puzzles】
题型:网络流
错误类型:
Runtime Error
(ACCESS_VIOLATION)
 #include <cstdio>
#include <cstdio>
 #include <cstring>
#include <cstring>
 #include <iostream>
#include <iostream>
 #include <algorithm>
#include <algorithm>
 using namespace std;
using namespace std;
 #define inf (1<<29)
#define inf (1<<29)
 const int maxn = 33333 , maxm = 60002000;
const int maxn = 33333 , maxm = 60002000;
 int NV,n,m;
int NV,n,m;
 int gap[maxn],dis[maxn],cur[maxn],pre[maxn];
int gap[maxn],dis[maxn],cur[maxn],pre[maxn];

 struct Edge
struct Edge  {
{
 int v,w,f,next;
    int v,w,f,next;

 Edge()
    Edge()  {}
{}

 Edge(int _v,int _w,int _next) : v(_v),w(_w),f(0),next(_next)
    Edge(int _v,int _w,int _next) : v(_v),w(_w),f(0),next(_next) {}
{}    
 }edge[maxm];
}edge[maxm];
 int E,head[maxn];
int E,head[maxn];

 void Init()
void Init()  {
{
 E=0;memset(head,-1,sizeof(int)*NV);
    E=0;memset(head,-1,sizeof(int)*NV); 
 }
}

 void addedge(int u,int v,int w)
void addedge(int u,int v,int w)  {
{
 edge[E]=Edge(v,w,head[u]);
    edge[E]=Edge(v,w,head[u]);
 head[u]=E++;
    head[u]=E++;
 edge[E]=Edge(u,w,head[v]);
    edge[E]=Edge(u,w,head[v]);
 head[v]=E++;
    head[v]=E++;    
 }
}

 int Sap(int st,int en)
int Sap(int st,int en)  {
{
 int maxf = 0;
    int maxf = 0;

 for(int i=0;i<NV;i++)
    for(int i=0;i<NV;i++)  {
{
 dis[i] = gap[i] = 0;
        dis[i] = gap[i] = 0;
 cur[i] = head[i];
        cur[i] = head[i];    
 }
    }    
 int u = pre[st] = st;
    int u = pre[st] = st;
 int aug = inf;
    int aug = inf;
 gap[0] = NV;
    gap[0] = NV;

 while( dis[st] < NV )
    while( dis[st] < NV )  {
{

 loop:   for(int &i=cur[u];i!=-1;i=edge[i].next)
loop:   for(int &i=cur[u];i!=-1;i=edge[i].next)  {
{
 int v = edge[i].v;
            int v = edge[i].v;

 if(edge[i].f && dis[u] == dis[v] + 1)
            if(edge[i].f && dis[u] == dis[v] + 1)  {
{
 aug = aug<edge[i].f ? aug : edge[i].f;
                aug = aug<edge[i].f ? aug : edge[i].f;
 pre[v] = u;
                pre[v] = u;
 u = v;
                u = v;

 if(v == en)
                if(v == en)  {
{
 maxf += aug;
                    maxf += aug;

 for(u=pre[u];v!=st;v=u,u=pre[u])
                    for(u=pre[u];v!=st;v=u,u=pre[u])  {
{
 edge[cur[u]].f -= aug;
                        edge[cur[u]].f -= aug;
 edge[cur[u]^1].f += aug;
                        edge[cur[u]^1].f += aug;    
 }
                    }    
 aug = inf;
                    aug = inf;
 }
                }    
 goto loop;
                goto loop;
 }
            }
 }
        }         
 int mindis = inf;
        int mindis = inf;

 for(int i=head[u];i!=-1;i=edge[i].next)
        for(int i=head[u];i!=-1;i=edge[i].next)  {
{
 int v = edge[i].v;
            int v = edge[i].v;

 if(edge[i].f && mindis > dis[v])
            if(edge[i].f && mindis > dis[v])  {
{
 cur[u] = i;
                cur[u] = i;
 mindis = dis[v];
                mindis = dis[v];    
 }
            }    
 }
        }
 if(--gap[dis[u]] == 0) break;
        if(--gap[dis[u]] == 0) break;
 gap[ dis[u] = mindis + 1 ] ++;
        gap[ dis[u] = mindis + 1 ] ++;
 u = pre[u];
        u = pre[u]; 
 }
    }
 return maxf;
    return maxf;
 }
}
 int dist[maxn];
int dist[maxn];
 int sta[maxn];
int sta[maxn];
 bool vis[maxn];
bool vis[maxn];

 void spfa1(int st,int en)
void spfa1(int st,int en)  {
{
 int u,v;
    int u,v;

 for(int i=0;i<NV;i++)
    for(int i=0;i<NV;i++)  {
{
 dist[i]=inf;
        dist[i]=inf;
 pre[i] = -1;
        pre[i] = -1;  
 vis[i] = 0;
        vis[i] = 0;  
 }
    }    
 int top = 0;
    int top = 0;
 sta[++top] = st;
    sta[++top] = st;
 dist[st] = 0;
    dist[st] = 0;

 while(top)
    while(top)  {
{
 u = sta[top--];
        u = sta[top--];
 vis[u] = 0;
        vis[u] = 0;

 for(int i=head[u];i!=-1;i=edge[i].next)
        for(int i=head[u];i!=-1;i=edge[i].next)  {
{
 v = edge[i].v;
            v = edge[i].v;
 int w = edge[i].w;
            int w = edge[i].w;

 if(dist[v] > dist[u] + w)
            if(dist[v] > dist[u] + w)  {
{
 dist[v] = dist[u] + w;
                dist[v] = dist[u] + w;

 if(!vis[v])
                if(!vis[v])  {
{
 vis[v] = 1;
                    vis[v] = 1;
 sta[++top] = v;
                    sta[++top] = v;    
 }
                }    
 }
            }   
 }
        }
 }
    }
 }
} 
 int rdist[maxn];
int rdist[maxn];

 void spfa2(int st,int en)
void spfa2(int st,int en)  {
{
 int u,v;
    int u,v;

 for(int i=0;i<NV;i++)
    for(int i=0;i<NV;i++)  {
{
 rdist[i]=inf;
        rdist[i]=inf;
 pre[i] = -1;
        pre[i] = -1;  
 vis[i] = 0;
        vis[i] = 0;  
 }
    }    
 int top = 0;
    int top = 0;
 sta[++top] = st;
    sta[++top] = st;
 rdist[st] = 0;
    rdist[st] = 0;

 while(top)
    while(top)  {
{
 u = sta[top--];
        u = sta[top--];
 vis[u] = 0;
        vis[u] = 0;

 for(int i=head[u];i!=-1;i=edge[i].next)
        for(int i=head[u];i!=-1;i=edge[i].next)  {
{
 v = edge[i].v;
            v = edge[i].v;
 int w = edge[i].w;
            int w = edge[i].w;

 if(rdist[v] > rdist[u] + w)
            if(rdist[v] > rdist[u] + w)  {
{
 rdist[v] = rdist[u] + w;
                rdist[v] = rdist[u] + w;

 if(!vis[v])
                if(!vis[v])  {
{
 vis[v] = 1;
                    vis[v] = 1;
 sta[++top] = v;
                    sta[++top] = v;    
 }
                }    
 }
            }   
 }
        }
 }
    }
 }
} 

 int main()
int main()  {
{
 int T;
    int T;
 scanf("%d",&T);
    scanf("%d",&T);

 while(T--)
    while(T--)  {
{
 scanf("%d%d",&n,&m);
        scanf("%d%d",&n,&m);
 NV = n;
        NV = n;
 Init();
        Init();
 int u,v,w,f;
        int u,v,w,f;

 for(int i=0;i<m;i++)
        for(int i=0;i<m;i++)  {
{
 scanf("%d%d%d",&u,&v,&w);
            scanf("%d%d%d",&u,&v,&w);
 u--;v--;
            u--;v--;
 addedge(u,v,w);
            addedge(u,v,w);
 }
        }    
 int st,en;
        int st,en;
 scanf("%d%d",&st,&en);
        scanf("%d%d",&st,&en);
 st--;en--;
        st--;en--;
 spfa1(st,en);
        spfa1(st,en);
 spfa2(en,st);
        spfa2(en,st);
 //printf("dist of en is %d\n",dist[en]);
        //printf("dist of en is %d\n",dist[en]);
 //printf("rdist of st is %d\n",rdist[st]);
        //printf("rdist of st is %d\n",rdist[st]);
 //for(int i=0;i<n;i++)
        //for(int i=0;i<n;i++) 
 //    printf("dist of no.%d is %d\n",i+1,dist[i]);
        //    printf("dist of no.%d is %d\n",i+1,dist[i]);
 //for(int i=0;i<n;i++)
        //for(int i=0;i<n;i++)
 //    printf("rdist od no.%d is %d\n",i+1,rdist[i]);
        //    printf("rdist od no.%d is %d\n",i+1,rdist[i]);
 int mindistance = dist[en];
        int mindistance = dist[en];

 for(u=0;u<n;u++)
        for(u=0;u<n;u++)  {
{

 if(dist[u]+rdist[u] == mindistance)
            if(dist[u]+rdist[u] == mindistance)  {
{

 for(int i=head[u];i!=-1;i=edge[i].next)
                for(int i=head[u];i!=-1;i=edge[i].next)  {
{
 v=edge[i].v;
                    v=edge[i].v;
 if(abs(dist[u]-dist[v]) == edge[i].w)
                    if(abs(dist[u]-dist[v]) == edge[i].w)
 edge[i].f = 1;
                        edge[i].f = 1;    
 }
                }    
 }
            }    
 }
        }
 int ans = Sap(st,en);
        int ans = Sap(st,en);
 printf("%d\n",ans);
        printf("%d\n",ans);
 }
    }
 return 0;
    return 0;    
 }
}

然后将栈改成了队列仍然是TLE了
I translate the stack to the queue but till TLE , below is the code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define inf (1<<29)
const int maxn = 2222 , maxm = 44444;
int n , N , m;
int maxf , minc;
int dist[maxn],p[maxn];
int que[maxn];
bool vis[maxn];
struct Edge {
    int u,v,f,c,next;    
}edge[maxm];
int E,head[maxn];
void init() {
    E=0; memset(head,-1,sizeof(int)*n);    
}
void _add(int u,int v,int f,int c) {
    edge[E].u=u;edge[E].v=v;edge[E].f=f;edge[E].c=c;edge[E].next=head[u];head[u]=E++;
}
void addedge(int u,int v,int f,int c) {
    _add(u,v,f,c); _add(v,u,0,-c);    
}
bool spfa(int s,int t) {
    for(int i=0;i<n;i++) dist[i]=inf,p[i]=-1,vis[i]=0;
    dist[s]=0;
    int front = 0 , rear = 0;
    que[rear++]=s;
    int u,v,f,c;
    while(front!=rear) {
        u=que[front++];
        if(front==maxn) front=0;
        for(int i=head[u];i!=-1;i=edge[i].next) {
            v=edge[i].v;
            f=edge[i].f;
            c=edge[i].c;
            if(f && dist[v] > dist[u] + c) {
                dist[v] = dist[u] + c;
                p[v] = i;
                if(!vis[v]) {
                    vis[v] = 1;
                    que[rear++] = v;
                    if(rear==maxn) rear = 0;    
                }    
            }    
        }
    }    
    return dist[t] != inf;
}
void mcmf(int s,int t) {
    maxf = minc = 0;
    while( spfa(s,t) ) {
        int minf = inf;
        for(int i=p[t];i!=-1;i=p[ edge[i].u ])
            if(minf > edge[i].f)
                minf = edge[i].f;
        maxf += minf;
        minc += dist[t] * minf;
        for(int i=p[t];i!=-1;i=p[ edge[i].u ]) {
            edge[i].f -= minf;
            edge[i^1].f += minf;    
        }    
    }
    return;
}
int main() {
    int T,cas=1;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&N,&m);
        int s = 0 , t = 2*N + 1;
        n = 2*N + 2;
        init();
        int u,v,c;
        while(m--) {
            scanf("%d%d%d",&u,&v,&c);
            addedge(u,v+N,1,c);
            addedge(v,u+N,1,c);
        }    
        for(int i=1;i<=N;i++) {
            addedge(s,i,1,0);
            addedge(i+N,t,1,0);    
        }
        mcmf(s,t);
        printf("Case %d: ",cas++);
        if(maxf != N) printf("NO\n");
        else printf("%d\n",minc);
    }
    return 0;    
}
posted on 2012-10-07 15:11 
YouAreInMyHeart 阅读(282) 
评论(0)  编辑 收藏 引用