#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int M=110,inf=0x3f3f3f3f;
struct node{
int x,y,l;
};
vector<node>g;
int n,len,dep[M],map[M][M],maz[M][M];
int bfs(int s,int t){
int i,u,v;
queue<int>q;
q.push(s);
memset(dep,-1,sizeof(dep));
dep[s]=0;
while(!q.empty()){
u=q.front();
q.pop();
for(i=0;i<len;i++){
if(g[i].x!=u||g[i].l==0)continue;
v=g[i].y;
if(dep[v]==-1){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t]!=-1;
}
int dfs(int u,int m,int t){
if(u==t)return m;
int p,i,v;
for(i=0;i<len;i++){
if(g[i].x!=u||g[i].l==0)continue;
v=g[i].y;
if(dep[v]==dep[u]+1){
p=dfs(v,min(m,g[i].l),t);
if(p){
g[i].l-=p;
g[i^1].l+=p;
return p;
}
}
}
return 0;
}
int dinic(int s,int t){
int p,ans=0;
while(bfs(s,t))
while(1){
p=dfs(s,inf,t);
if(p==0)break;
ans+=p;
}
return ans;
}
int main(){
int i,j,k,s,t;
while(scanf("%d",&n)==1){
g.clear();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&map[i][j]);
if(i==j)map[i][j]=0;
if(map[i][j]==-1)map[i][j]=inf;
maz[i][j]=map[i][j];
}
scanf("%d%d",&s,&t);
s++;t++;
if(s==t){
printf("inf\n");
continue;
}
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]);
for(i=1;i<=n;i++)
if(maz[s][i]!=inf)
for(j=1;j<=n;j++)
if(i!=j&&maz[s][i]!=inf&&map[i][j]!=inf&&maz[j][t]!=inf&&maz[s][t]!=inf&&maz[s][i]+map[i][j]+maz[j][t]==maz[s][t]){
g.push_back((node){i,j,1});
g.push_back((node){j,i,0});
}
len=g.size();
printf("%d\n",dinic(s,t));
}
return 0;
}
ZOJ 2760 How Many Shortest Path
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.