2 条题解
-
1
最大流 算法:
#include<bits/stdc++.h> using namespace std; const int inf=1<<30; int dep[10101],head[10101],inque[10101]; int top=1; int maxflow=0,ans=0; int n,m,s,t,x; inline int read() { int x=0;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x; } struct Node { int v; int val; int next; }node[200100]; inline void addedge(int u,int v,int val) { node[++top].v=v; node[top].val=val; node[top].next=head[u]; head[u]=top; } bool bfs() { memset(dep,0x3f,sizeof(dep)); memset(inque,0,sizeof(inque)); dep[s]=0; queue<int>q; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); inque[u]=0; for(int i=head[u];i;i=node[i].next) { int d=node[i].v; if(dep[d]>dep[u]+1&&node[i].val) { dep[d]=dep[u]+1; if(inque[d]==0) { q.push(d); inque[d]=1; } } } } if(dep[t]!=0x3f3f3f3f) { return 1; } return 0; } inline int min(int x,int y) { return x<y?x:y; } int dfs(int u,int flow) { int rlow=0; if(u==t) { return flow; } for(int i=head[u];i;i=node[i].next) { int d=node[i].v; if(node[i].val and dep[d]==dep[u]+1) { if(rlow=dfs(d,min(flow,node[i].val))) { node[i].val-=rlow; node[i^1].val+=rlow; return rlow; } } } return 0; } int dinic() { int lowflow; while(bfs()) { while(lowflow=dfs(s,inf)) { maxflow+=lowflow; } } return maxflow; } int main() { n=read(); m=read(); x=read(); s=1,t=n; for(int i=1;i<=m;i++) { int u,v,val; u=read(),v=read(),val=read(),addedge(u,v,val),addedge(v,u,0); } ans=dinic(); if(ans) { printf("%d %d\n",ans,(x-1)/ans+1); } else { printf("Orz Ni Jinan Saint Cow!\n"); } return 0; }
-
1
#include<bits/stdc++.h> using namespace std; const int N=2009; struct edge{int to,nxt,w;}e[N*2];int hd[N],tot=1; void add(int u,int v,int w){ e[++tot]=(edge){v,hd[u],w}; hd[u]=tot; } int n,m,d[N],ans,x; bool bfs(){ queue<int>q; memset(d,0,sizeof(d)); q.push(1),d[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=hd[u],v;i;i=e[i].nxt) if(!d[v=e[i].to]&&e[i].w){ q.push(v),d[v]=d[u]+1; if(v==n) return 1; } } return 0; } int dfs(int u,int flow){ if(u==n) return flow; int rest=flow; for(int i=hd[u],v;i&&rest;i=e[i].nxt){ if(e[i].w&&d[v=e[i].to]==d[u]+1){ int tmp=dfs(v,min(rest,e[i].w)); if(!tmp) d[v]=0; rest-=tmp; e[i].w-=tmp; e[i^1].w+=tmp; } } return flow-rest; //真正给出去的 } int main(){ scanf("%d%d%d",&n,&m,&x); for(int i=1,u,v,w;i<=m;i++) scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,0); int tmp=0; while(bfs()) while(tmp=dfs(1,1e9)) ans+=tmp; if(!ans){puts("Orz Ni Jinan Saint Cow!");return 0;} printf("%d ",ans); int a2=ceil(x*1./ans); printf("%d",a2); return 0; }
- 1
信息
- ID
- 344
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 6
- 已通过
- 4
- 上传者