地震逃生
題意:
- 每條邊有最大容量。但是有多條邊。求出數(shù)量
需要多少批才能運(yùn)送完成
思路:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int M=40010;
int n,m,x,cnt=0;
int head[M];
int dis[M];
int cur[M];
struct node
{
int v,w,nxt;
} edge[M];
void add(int x,int y,int w)
{
edge[cnt].v=y;
edge[cnt].w=w;
edge[cnt].nxt=head[x];
head[x]=cnt++;
}
void dataset( )
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&x);
int a,b,c;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,0);
}
}
bool bfs()
{
memset(dis,-1,sizeof(dis));
dis[1]=0;
queue<int>qu;
qu.push(1);
while(!qu.empty( ))
{
int u=qu.front( );
qu.pop( );
for(int i=head[u]; i!=-1; i=edge[i].nxt)
{
int v=edge[i].v;
if(dis[v]==-1&&edge[i].w)
{
dis[v]=dis[u]+1;
qu.push(v);
}
}
}
return dis[n]!=-1;
}
int dfs(int u,int flo)
{
if(u==n)
{
return flo;
}
int detla=flo;
for(int i=cur[u]; i!=-1; i=edge[i].nxt)
{
cur[u]=edge[i].nxt;
int v=edge[i].v;
if(dis[v]==dis[u]+1&&edge[i].w>0)
{
int d=dfs(v,min(detla,edge[i].w));
edge[i].w-=d;
edge[i^1].w+=d;
detla-=d;
if(detla==0)
{
break;
}
}
}
// for(int i=head[u];i!=-1;i=edge[i].nxt)
// {
// int v=edge[i].v;
// if(dis[v]==dis[u]+1&&edge[i].w>0)
// {
// int d=dfs(v,min(detla,edge[i].w));
// edge[i].w-=d;
// edge[i^1].w+=d;
// detla-=d;
// if(detla==0)
// {
// break;
// }
// }
// }
return flo-detla;
}
int dini( )
{
int ans=0;
while(bfs( ))
{
for(int i=1; i<=n; i++)
{
cur[i]=head[i];
}
ans+=dfs(1,INF);
}
return ans;
}
int main( )
{
dataset( );
int a=dini( );
if(a!=0)
{
if(x%a)
{
printf("%d %d\n",a,x/a+1);
}
else
{
printf("%d %d\n",a,x/a);
}
}
else
{
printf("Orz Ni Jinan Saint Cow!\n");
}
return 0;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。