ZOJ 2760 How Many Shortest Path

#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;
}

發佈了158 篇原創文章 · 獲贊 0 · 訪問量 8435
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章