#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=60+5;
const int maxm=10000+5;
const int inf=100000000;
int in[maxn],pre[maxn],vis[maxn],color[maxn],s[maxm],e[maxm],dis[maxm],cost[maxm];
int n,m,c;
int temps[maxm],tempe[maxm],tempd[maxm],tempc[maxm];
bool MDST(int root,int mincost)
{
int ans=0;
while(true)
{
memset(in,0x7f,sizeof(in));
memset(pre,-1,sizeof(pre));
for(int i=1;i<=m;i++){
if(cost[i]<in[e[i]]&&s[i]!=e[i]){
in[e[i]]=cost[i];
pre[e[i]]=s[i];
}
}
for(int i=1;i<=n;i++) if(i!=root&&pre[i]==-1) return false;
int cnt=0;in[root]=0;;
memset(vis,-1,sizeof(vis));
memset(color,-1,sizeof(color));
for(int i=1;i<=n;i++){
int u,v=i;ans+=in[i];
while(v!=root&&vis[v]==-1) {vis[v]=i;v=pre[v];}
if(v!=root&&vis[v]==i)
for(color[v]=++cnt,u=pre[v];u!=v;u=pre[u]) color[u]=cnt;
}
if(cnt==0) break;
for(int i=1;i<=n;i++) if(color[i]==-1) color[i]=++cnt;
for(int i=1;i<=m;i++){
int u=s[i],v=e[i];
s[i]=color[u],e[i]=color[v];
if(color[u]!=color[v]) cost[i]-=in[v];
}
n=cnt;root=color[root];
}
if(ans<=c) return true;
else return false;
}
int main()
{
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
int tempn,tempm;
int l=inf,r=-inf;
scanf("%d%d%d",&n,&m,&c);
tempn=n;tempm=m;
for(int i=1;i<=m;i++) {
scanf("%d%d%d%d",&s[i],&e[i],&dis[i],&cost[i]);
s[i]++;e[i]++;
temps[i]=s[i];tempe[i]=e[i];tempd[i]=dis[i];tempc[i]=cost[i];
l=min(l,dis[i]);r=max(r,dis[i]);
if(s[i]==e[i]) cost[i]=inf;
}
while(l<r)
{
int mid=l+(r-l+1)/2;
n=tempn;m=tempm;
for(int i=1;i<=m;i++) {
s[i]=temps[i];e[i]=tempe[i];dis[i]=tempd[i];cost[i]=tempc[i];
if(dis[i]<mid) cost[i]=inf;
}
bool ok=MDST(1,mid);
if(ok) l=mid;
else r=mid-1;
}
n=tempn;m=tempm;
for(int i=1;i<=m;i++) {s[i]=temps[i];e[i]=tempe[i];dis[i]=tempd[i];cost[i]=tempc[i];}
if(MDST(1,l)) printf("%d kbps\n",l);
else printf("streaming not possible.\n");
}
return 0;
}
UVA 11865 Stream My Contest(最小树形图+二分)
最新推荐文章于 2018-07-17 15:36:20 发布