「BZOJ3931」[CQOI2015] 网络吞吐量
题意即题解
最短路+网络流
1A了赞233
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include<set> #include<map> #include<ctime> #include<queue> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define inf 100000000000000LL #define pa pair<int,int> #define ll long long using namespace std; ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,cnt,T; ll dis[505]; int last[1005],cur[1005],q[1005],h[1005]; int a[100005],b[100005],d[100005]; struct data{ int to,next;ll v; }e[200005]; void insert(int u,int v,ll w) { e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[cnt].v=w; } void dijkstra() { priority_queue<pa,vector<pa>,greater<pa> >q; for(int i=1;i<=n;i++)dis[i]=inf; dis[1]=0;q.push(make_pair(0,1)); while(!q.empty()) { int now=q.top().second;q.pop(); for(int i=last[now];i;i=e[i].next) if(dis[now]+e[i].v<dis[e[i].to]) { dis[e[i].to]=dis[now]+e[i].v; q.push(make_pair(dis[e[i].to],e[i].to)); } } } bool bfs() { int head=0,tail=1; for(int i=1;i<=2*n;i++)h[i]=-1; q[0]=1;h[1]=0; while(head!=tail) { int x=q[head];head++; for(int i=last[x];i;i=e[i].next) if(e[i].v&&h[e[i].to]==-1) { h[e[i].to]=h[x]+1; q[tail++]=e[i].to; } } return h[2*n]!=-1; } ll dfs(int x,ll f) { if(x==2*n)return f; ll w,used=0; for(int i=cur[x];i;i=e[i].next) if(h[e[i].to]==h[x]+1) { w=dfs(e[i].to,min(e[i].v,f-used)); e[i].v-=w;e[i^1].v+=w; if(e[i].v)cur[x]=i; used+=w;if(used==f)return f; } if(!used)h[x]=-1; return used; } ll dinic() { ll ans=0; while(bfs()) { for(int i=1;i<=2*n;i++)cur[i]=last[i]; ans+=dfs(1,inf); } return ans; } int main() { n=read();m=read(); for(int i=1;i<=m;i++) { a[i]=read(),b[i]=read(),d[i]=read(); insert(a[i],b[i],d[i]); insert(b[i],a[i],d[i]); } dijkstra(); for(int i=1;i<=n;i++)last[i]=0; cnt=1; for(int i=1;i<=m;i++) { if(dis[a[i]]+d[i]==dis[b[i]]) { insert(a[i]+n,b[i],inf); insert(b[i],a[i]+n,0); } if(dis[b[i]]+d[i]==dis[a[i]]) { insert(b[i]+n,a[i],inf); insert(a[i],b[i]+n,0); } } for(int i=1;i<=n;i++) { int c=read(); if(i!=1&&i!=n)insert(i,i+n,c); else insert(i,i+n,inf); insert(i+n,i,0); } printf("%lld\n",dinic()); return 0; } |
黄学长,带带我,我想学建图啊
只错一个点是怎么回事??
为什么那个cnt再次赋值时为0就错了,为1就过了呢??
网络流反向弧。。。
3931无题面是被权限了吗?……
被河蟹了
谢
谢