标签:des style blog color 使用 os strong io
Description
Input
Output
Sample Input
2 2 1 10 1 2 13 10 4 4 20 1 2 1000 15 2 4 999 6 1 3 100 15 3 4 99 4
Sample Output
13 99
由1点到n点的通过量取决于在这条路上的最小的路的容量,这样按最终通过量来进行二分,枚举可能出现的通过量,计算最短时间,如果时间小于或等于最大时间t,将通过量上调,直到最短时间大于t,这样最后一次通过的 就是最大通过量。使用SPFA来简化计算量
原理:随着通过量的增加,会使可以使用的边变少,总会使求出的最短时间不变或是增加,这样就得到了通过量于最短时间的线性关系。最终只要最短时间不超过t就可以让通过量增加。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int x , y , v , w ;
node *next ;
} *head[20000];
void add(int x,int y,int v,int w)
{
node *q = new node ;
q->x = x ;
q->y = y ;
q->v = v ;
q->w = w ;
q->next = head[x] ;
head[x] = q ;
}
int dis[20000] , vis[20000] ;
queue <int> Q ;
int spfa(int n,int mid)
{
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
while( !Q.empty() )
Q.pop() ;
dis[1] = 0 ;
vis[1] = 1 ;
Q.push(1);
while( !Q.empty() )
{
int x = Q.front() , y , v ;
Q.pop() ;
vis[x] = 0 ;
for( node *q = head[x] ; q != NULL ; q = q->next )
{
x = q->x ;
y = q->y ;
v = q->v ;
if( v >= mid && dis[y] > dis[x] + q->w )
{
dis[y] = dis[x] + q->w ;
if( !vis[y] )
{
vis[y] = 1;
Q.push(y) ;
}
}
}
}
return dis[n] ;
}
int main()
{
int t , i , j , n , m , time ;
node *q ;
scanf("%d", &t);
while(t--)
{
memset(head,NULL,sizeof(head));
scanf("%d %d %d", &n, &m, &time);
int x , y , v , w , low = INF , top = 0 ;
for(i = 0 ; i < m ; i++)
{
scanf("%d %d %d %d", &x, &y, &v, &w);
add(x,y,v,w);
add(y,x,v,w);
low = min(low,v);
top = max(top,v);
}
int mid , ans ;
while(low <= top)
{
mid = (low + top)/2;
if( spfa(n,mid) <= time )
{
ans = mid ;
low = mid + 1;
}
else
top = mid - 1 ;
}
printf("%d\n", ans);
}
return 0;
}
复习图---Delay Constrained Maximum Capacity Path(SPFA+二分),布布扣,bubuko.com
复习图---Delay Constrained Maximum Capacity Path(SPFA+二分)
标签:des style blog color 使用 os strong io
原文地址:http://blog.csdn.net/winddreams/article/details/38348751