ZOJ 2760

来源:互联网 发布:淘宝上买东西靠谱吗 编辑:程序博客网 时间:2024/06/04 01:10
#include<string.h>#include<cstdio>#include<cstdlib>#include<iostream>#include<vector> #include<set>#include<algorithm> #include<cmath>#include<queue>#define inf 0x3f3f3f3f#define INF 1<<20using namespace std;const int MAX_V=220; struct edge{int to,cap,rev;};vector<edge>G[MAX_V];int level[MAX_V];int iter[MAX_V];int map[MAX_V][MAX_V];int maz[MAX_V][MAX_V];void add_edge(int from,int to,int cap){G[from].push_back((edge){to,cap,G[to].size()});G[to].push_back((edge){from,0,G[from].size()-1});}void bfs(int s){memset(level,-1,sizeof(level));queue<int>que;level[s]=0;que.push(s);while(!que.empty()){int v=que.front();que.pop();for(int i=0;i<G[v].size();i++){edge& e=G[v][i];if(e.cap>0&&level[e.to]<0){level[e.to]=level[v]+1;que.push(e.to);}}}}int dfs(int v,int t,int f){if(v==t)return f;for(int &i=iter[v];i<G[v].size();i++){edge& e=G[v][i];if(e.cap>0&&level[v]<level[e.to]){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d;G[e.to][e.rev].cap+=d;return d;}}}return 0;}int max_flow(int s,int t){int flow=0;for(;;){bfs(s);if(level[t]<0)return flow;memset(iter,0,sizeof(iter));int f;while((f=dfs(s,t,INF))>0){flow+=f;}}}int  floyd(int n){int i,j,k;for( k=1;k<=n;k++){for( i=1;i<=n;i++){for( j=1;j<=n;j++){maz[i][j]=min(maz[i][j],maz[i][k]+maz[k][j]);}}}}void buildmap(int s,int t,int n){for(int i=1;i<=n;i++){if(maz[s][i]==inf)continue;for(int j=1;j<=n;j++){if(i==j||maz[j][t]==inf||maz[i][j]==inf)continue;if(maz[s][t]==maz[s][i]+map[i][j]+maz[j][t]){add_edge(i,j,1);}}}}int main(){int n;int s,t;while(scanf("%d",&n)!=EOF){memset(iter,0,sizeof(iter));for(int i=1;i<=n;i++)G[i].clear();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&maz[i][j]);if(maz[i][j]==-1)maz[i][j]=inf;if(i==j){maz[i][j]=0;}map[i][j]=maz[i][j];}}scanf("%d%d",&s,&t);s++;t++;if(s==t){cout<<"inf"<<endl;continue;}floyd(n);buildmap(s,t,n);cout<<max_flow(s,t)<<endl;}return 0;}

原创粉丝点击