题意:有N个点,之间有P条路(双向),要求每次从1到N走不同的路T次,求这T次中两点间路最长的一条
思路:二分+最大流,如果两点之间有路,就建立流量为1的网络,然后二分路径长度,从新建立符合要求的图,求最大流
注意重边的情况,如果是邻接表没事,否则注意,边不是取最小,要都存下,因为有可能都符合要求,WA了很多次都是错在这了
三个小时就这么没了……今天一早,看出了原因了,于是用vector解决了,明显很慢啊,不知道是不是模板的原因……
核心code:
vector<int> map[nMax][nMax]; //原始图
void rebuild(int mid)
{
memset(G, 0, sizeof(G));
memset(F, 0, sizeof(F)); //流
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
int tt=map[i][j].size();
for(int t=0; t<tt; t++)
if(map[i][j][t]<=mid)
G[i][j]+=1; //重建的网络
}
}
int main()
{
scanf("%d%d%d", &n, &m, &t);
source=1; //源点
sink=n; //汇点
int x, y, dist;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &x, &y, &dist);
map[x][y].push_back(dist);
map[y][x].push_back(dist);
Max=max(Max, dist);
Min=min(Min, dist);
}
int mid,flow;
while(Max > Min)
{
mid=(Max+Min)/2;
rebuild(mid);
//cout<<ans<<" ";
flow=find_max_flow();
if(flow>=t)
Max=mid;
else
Min=mid+1;
}
printf("%d\n", Max);
return 0;
}
作者:FreeAquar
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。