Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1192 Accepted Submission(s): 440
ios
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <queue> using namespace std; const int INF = 999999999; const int N = 600; const int M = 200005; struct Edge{ int u,v,cap,cost,next; }edge[M]; int head[N],tot,low[N],pre[N]; int total; bool vis[N]; void addEdge(int u,int v,int cap,int cost,int &k){ edge[k].u=u,edge[k].v=v,edge[k].cap = cap,edge[k].cost = cost,edge[k].next = head[u],head[u] = k++; edge[k].u=v,edge[k].v=u,edge[k].cap = 0,edge[k].cost = -cost,edge[k].next = head[v],head[v] = k++; } void init(){ memset(head,-1,sizeof(head)); tot = 0; } bool spfa(int s,int t,int n){ memset(vis,false,sizeof(vis)); for(int i=0;i<=n;i++){ low[i] = (i==s)?0:INF; pre[i] = -1; } queue<int> q; q.push(s); while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = false; for(int k=head[u];k!=-1;k=edge[k].next){ int v = edge[k].v; if(edge[k].cap>0&&low[v]>low[u]+edge[k].cost){ low[v] = low[u] + edge[k].cost; pre[v] = k; ///v爲終點對應的邊 if(!vis[v]){ vis[v] = true; q.push(v); } } } } if(pre[t]==-1) return false; return true; } int MCMF(int s,int t,int n){ int mincost = 0,minflow,flow=0; while(spfa(s,t,n)) { if(low[t]>=0) break; minflow=INF+1; for(int i=pre[t];i!=-1;i=pre[edge[i].u]) minflow=min(minflow,edge[i].cap); flow+=minflow; for(int i=pre[t];i!=-1;i=pre[edge[i].u]) { edge[i].cap-=minflow; edge[i^1].cap+=minflow; } mincost+=low[t]*minflow; } total=flow; return mincost; } int main() { int n,m,h,tcase; while(scanf("%d%d",&n,&m)!=EOF){ init(); int s = 0,t = n+1; for(int i=1;i<=n;i++){ //if(a[i]>=mx) b[i] = 0; int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); addEdge(s,i,b,a,tot); addEdge(i,t,d,-c,tot); } for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); addEdge(u,v,INF,w,tot); addEdge(v,u,INF,w,tot); } long long ans = MCMF(s,t,n+1); cout<<-ans<<endl; } return 0; }