B1631 [Usaco2007 Feb]Cow Party

346 阅读1分钟

image.png

image.png

image.png

队列的相关概念:

image.png

每头牛有两个动作:1.参加派对 2.回家

求出每个点距离距离排队点最短的距离并存储下来然后找出最短来回路径的最大值就行。

找出最短路径可以封装成一个函数,回来的时候的最短路径就是反向图。

注意一些初始化问题

struct edge
{
	int v,w;
};
vector<edge>e[3][1010];//动态数组存边 
queue<int>q;//队列 
int n,m,l,f[3][1010],ans;//f数组表示在正向图和反向图中终点到各点最短距离
bool vis[1010];//vis数组表示各点是否在队列中 

void spfa(int k)//k=1时正向图,k=2时反向图 
{
	memset(vis,0,sizeof vis);//初始化false 
	vis[l]=true;
	f[k][l]=0;
	q.push(l);
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		vis[now]=false;
		for(int i=0;i<e[k][now].size();i++)//遍历从now点出发的各边 
		{
			int v=e[k][now][i].v,w=e[k][now][i].w;
			if(f[k][v]>f[k][now]+w)
			{
				f[k][v]=f[k][now]+w;
				if(!vis[v])
				{
					vis[v]=true;
					q.push(v);
				}
			}
		}
	}
}

int main(){
	
	for(int i=1;i<=m;i++)
	{

		edge cmp;
		cmp.v=v;
		cmp.w=w;
		e[1][u].push_back(cmp);//存正向图 
		cmp.v=u;
		e[2][v].push_back(cmp);//存反向图 
	}
	spfa(1);//跑正向图 
	spfa(2);//跑反向图 
	
	//找最长的 
	
	cout<<ans;
}