Address: HDU 3435
This question is just coming up, and I feel like I have no clue .. Think about it again .. I found that it is similar to the first two charge streams I made. It can be converted to above.
Graph creation is almost the same, but here it is an undirected graph. When creating a graph, it is still a split point, determining the inbound and outbound degree, and finally determining whether the stream is full. If the stream is full, the billing flow meets the requirements. If the output is not full, no is output.
The Code is as follows:
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;int head[3000], source, sink, cnt, flow, cost, num;int d[3000], vis[3000], pre[3000], cur[3000];queue<int>q;struct node{ int u, v, cap, cost, next;}edge[10000000];void add(int u, int v, int cap, int cost){ edge[cnt].v=v; edge[cnt].cap=cap; edge[cnt].cost=cost; edge[cnt].next=head[u]; head[u]=cnt++; edge[cnt].v=u; edge[cnt].cap=0; edge[cnt].cost=-cost; edge[cnt].next=head[v]; head[v]=cnt++;}int spfa(){ memset(d,INF,sizeof(d)); memset(vis,0,sizeof(vis)); int minflow=INF, i; q.push(source); d[source]=0; cur[source]=-1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(d[v]>d[u]+edge[i].cost&&edge[i].cap) { d[v]=d[u]+edge[i].cost; minflow=min(minflow,edge[i].cap); cur[v]=i; if(!vis[v]) { q.push(v); vis[v]=1; } } } } if(d[sink]==INF) return 0; flow+=minflow; cost+=minflow*d[sink]; for(i=cur[sink];i!=-1;i=cur[edge[i^1].v]) { edge[i].cap-=minflow; edge[i^1].cap+=minflow; } return 1;}void mcmf(int n){ while(spfa()); if(flow==n) printf("%d\n",cost); else printf("NO\n");}int main(){ int t, n, m, i, j, a, b, c; scanf("%d",&t); num=0; while(t--) { num++; scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); cnt=0; source=0; sink=2*n+1; flow=0; cost=0; for(i=1;i<=n;i++) { add(source,i,1,0); add(i+n,sink,1,0); } while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b+n,1,c); add(b,a+n,1,c); } printf("Case %d: ",num); mcmf(n); } return 0;}