codechef Annual Parade - 费用流 - 二分

题目大意:总之就是要做最小路径覆盖,路径只要不是长度大于1的环就要额外支付C的代价。多次给出C求答案。 n ≤ 250 , m ≤ 30000 , q ≤ 1 0 4 n\le250,m\le30000,q\le10^4 n250,m30000,q104
题解:考虑固定c怎么做。考虑无向图最小路径覆盖的过程,每次要么是合并两条路径,可以少支付一个C,要么形成一个环,也可以少支付一个C。因此就是最小路径覆盖每次增广收益是cost-C(一开始是nC)。至于最小路径覆盖怎么做,注意到可以求传递闭包之后直接做最小链覆盖。至于这个怎么做请自行百度(逃)。
然后每次询问的时候显然会选择cost<C的cost去增广,二分即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
	int x,ch;while((ch=gc)<'0'||ch>'9');
	x=ch^'0';while((ch=gc)>='0'&&ch<='9')
		x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=510,M=3000010,INF=1000000000;
struct edges{
	int from,to,pre,resf,cost;
}e[M];int h[N],etop,g[N][N],x[N],y[N],d[N],inq[N],fr[N],lstc;queue<int> q;pii lst[N];
inline int add_edge(int u,int v,int f,int c) { int x=++etop;return e[x].from=u,e[x].to=v,e[x].pre=h[u],h[u]=x,e[x].resf=f,e[x].cost=c; }
inline int build_edge(int u,int v,int f,int c) { return add_edge(u,v,f,c),add_edge(v,u,0,-c); }
inline int spfa(int s,int t)
{
	rep(i,1,t) d[i]=INF,inq[i]=fr[i]=0;
	while(!q.empty()) q.pop();
	d[s]=0,inq[s]=1,q.push(s);
	while(!q.empty())
	{
		int x=q.front();q.pop(),inq[x]=0;
		for(int i=h[x],y;i;i=e[i].pre)
			if(e[i].resf&&d[y=e[i].to]>d[x]+e[i].cost)
				d[y]=d[x]+e[i].cost,fr[y]=i,(!inq[y]?inq[y]=1,q.push(y),0:0);
	}
	if(!fr[t]) return 0;
	for(int i=fr[t];i;i=fr[e[i].from])
		e[i].resf--,e[((i-1)^1)+1].resf++;
	return lst[++lstc]=mp(d[t],d[t]),1;
}
inline int min_cost(int s,int t) { while(spfa(s,t));return 0; }
inline int query(int n,int c)
{
	int L=1,R=lstc;
	while(L<=R)
	{
		int mid=(L+R)>>1;
		if(lst[mid].fir<c) L=mid+1;
		else R=mid-1;
	}
	return n*c-R*c+lst[R].sec;
}
int main()
{
	int n=inn(),m=inn(),q=inn(),u,v,cnt=0;
	rep(i,1,n) rep(j,1,n) g[i][j]=INF;rep(i,1,n) g[i][i]=0;
	rep(i,1,m) u=inn(),v=inn(),g[u][v]=min(g[u][v],inn());
	rep(k,1,n) rep(i,1,n) rep(j,1,n) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
	rep(i,1,n) g[i][i]=INF,x[i]=++cnt,y[i]=++cnt;int s=++cnt,t=++cnt;
	rep(i,1,n) build_edge(s,x[i],1,0),build_edge(y[i],t,1,0);
	rep(i,1,n) rep(j,1,n) if(g[i][j]<INF) build_edge(x[i],y[j],1,g[i][j]);
	min_cost(s,t);rep(i,1,lstc) lst[i].sec+=lst[i-1].sec;
	while(q--) printf("%d\n",query(n,inn()));return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Type-C Cable是一种符合Universal Serial Bus Type-C Cable and Connector Specification R2.0标准的USB-C数据线。\[1\]根据引用\[2\]的描述,由于非公开协议的限制,Intel TBT Gen3开始已经可以应用在USB-C Port上,所以对于TBT的相关Cable应该也会有兼容。而根据引用\[3\]的描述,谱瑞(Parade)收购了睿思科技(Fresco Logic),这可能意味着他们在USB这块有一定的技术积累。因此,Type-C Cable可能具备兼容TBT和USB 3.0的功能。 #### 引用[.reference_title] - *1* [【硬件】【USB】【Type-C】](https://blog.csdn.net/syjie19900426/article/details/109054926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Usb Type-C 1.2 Usb Type-C Cable](https://blog.csdn.net/Strider_kong/article/details/126056566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PS188——谱瑞(Parade)推动的 Type-C扩展坞红海战略](https://blog.csdn.net/Type_C_Ken/article/details/124349798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值