标签:for amp inf return sign 空格 固定 bsp code
/* map: 1、S --(aij / 0)-> point ij ,(i<n,1<=j<=7); point ij--(bij / 0)->T 2、point ij --(vi / wi)-> point i(j+1) ,(i<n,1<=j<=6); point i7 --(vi / wi)-> point i1 3、point xj <--(inf / edge_wi)-> point yj (every (x,y)mentioned,1<=j<=7); */ #include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int N=1005; const int inf=2e9; struct edge{int v,next,cap,cost;}e[N*400];int tot=1,head[N]; int n,m,ans,S,T,dis[N],pre[N],q[N*80];bool vis[N]; void add(int x,int y,int z,int cost=0){ e[++tot].v=y;e[tot].cap=z;e[tot].cost=cost;e[tot].next=head[x];head[x]=tot; e[++tot].v=x;e[tot].cap=0;e[tot].cost=-cost;e[tot].next=head[y];head[y]=tot; } bool spfa(){ memset(vis,0,sizeof vis); memset(dis,0x3f,sizeof dis); unsigned short h=0,t=1;q[t]=S;dis[S]=0;vis[S]=1; while(h!=t){ int x=q[++h];vis[x]=0; for(int i=head[x];i;i=e[i].next){ if(e[i].cap&&dis[e[i].v]>dis[x]+e[i].cost){ dis[e[i].v]=dis[x]+e[i].cost; pre[e[i].v]=i; if(!vis[e[i].v]){ vis[e[i].v]=1; q[++t]=e[i].v; } } } } return dis[T]<0x3f3f3f3f; } int augment(){ int flow=0x3f3f3f3f; for(int i=T;i!=S;i=e[pre[i]^1].v) flow=min(flow,e[pre[i]].cap); for(int i=T;i!=S;i=e[pre[i]^1].v){ e[pre[i]].cap-=flow; e[pre[i]^1].cap+=flow; } return dis[T]*flow; } int main(){ scanf("%d%d",&n,&m); S=0,T=n*7+1; for(int i=0,x,v,w;i<n;i++){ for(int j=1;j<=7;j++) scanf("%d",&x),add(S,i*7+j,x,0); for(int j=1;j<=7;j++) scanf("%d",&x),add(i*7+j,T,x,0); scanf("%d%d",&v,&w); for(int j=1;j<=6;j++) add(i*7+j,i*7+j+1,v,w); add(i*7+7,i*7+1,v,w); } for(int i=0,x,y,z;i<m;i++){ scanf("%d%d%d",&x,&y,&z); for(int i=1;i<=7;i++){ add((x-1)*7+i,(y-1)*7+i,inf,z); add((y-1)*7+i,(x-1)*7+i,inf,z); } } while(spfa()) ans+=augment(); printf("%d\n",ans); return 0; }
标签:for amp inf return sign 空格 固定 bsp code
原文地址:https://www.cnblogs.com/shenben/p/12287759.html