题目传送门

分析:

没被访问的点要C费用,跑一次路要C费用

把这两个统一一下试试。。。

那就是每次不标记起点或者终点

那就是路径覆盖了2333

二分图,x 部 i 号点与 y 部 j 号点连 i 到 j 的最短路

然后每个点都会被访问到

但是有些的代价会大于C

那些就干脆不访问了吧2333

看看费用流的函数特征

是一个单增函数

某一刻一单位流的代价大于了C,那就可以停止了

由于C会变,先求出整个的费用流函数,每次二分查找就好了

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue> #define maxn 2005
#define maxm 200005
#define INF 0x3f3f3f3f using namespace std; inline int getint()
{
int num=,flag=;char c;
while((c=getchar())<''||c>'')if(c=='-')flag=-;
while(c>=''&&c<='')num=num*+c-,c=getchar();
return num*flag;
} int n,m,Q;
int S,T;
int fir[maxn],nxt[maxm],to[maxm],cnt;
int cap[maxm],cst[maxm];
int dis[maxn];
int vis[maxn],pre[maxn];
int sum[maxn],tot;
int D[maxn][maxn]; inline void newnode(int u,int v,int w,long long c)
{to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,cap[cnt]=w,cst[cnt]=c;}
inline void insert(int u,int v,int w,long long c)
{newnode(u,v,w,c),newnode(v,u,,-c);} inline bool spfa()
{
memset(dis,INF,sizeof dis);dis[S]=;
memset(pre,-,sizeof pre);
queue<int>Q;Q.push(S),vis[S]=;
while(!Q.empty())
{
int u=Q.front();Q.pop();vis[u]=;
for(int i=fir[u];i;i=nxt[i])
if(cap[i]&&dis[to[i]]>dis[u]+cst[i])
{
dis[to[i]]=dis[u]+cst[i];pre[to[i]]=i^;
if(!vis[to[i]])vis[to[i]]=,Q.push(to[i]);
}
}
return ~pre[T];
} inline int dinic()
{
int num=;
while(spfa())
{
tot++;
sum[tot]=sum[tot-];
int mn=INF;
for(int i=pre[T];i!=-;i=pre[to[i]])mn=min(mn,cap[i^]);
int tmp=;
for(int i=pre[T];i!=-;i=pre[to[i]])cap[i]+=mn,cap[i^]-=mn,tmp+=cst[i^];
sum[tot]+=tmp*mn,num+=mn;
}
return num;
} int main()
{
n=getint(),m=getint(),Q=getint();
S=n*+,T=S+,cnt=;
memset(D,INF,sizeof D);
for(int i=;i<=n;i++)D[i][i]=;
for(int i=;i<=m;i++)
{
int u=getint(),v=getint();
D[u][v]=min(getint(),D[u][v]);
}
for(int k=;k<=n;k++)for(int i=;i<=n;i++)for(int j=;j<=n;j++)
D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
for(int i=;i<=n;i++)insert(S,i,,),insert(i+n,T,,);
for(int i=;i<=n;i++)for(int j=;j<=n;j++)if(i^j)insert(i,j+n,,D[i][j]);
dinic();
while(Q--)
{
int C=getint(),l=,r=tot,ans=;
while(l<=r)
{
int mid=(l+r)>>;
if(sum[mid]-sum[mid-]<C)l=mid+,ans=mid;
else r=mid-;
}
printf("%d\n",sum[ans]+(n-ans)*C);
}
}

最新文章

  1. iOS-开发者相关的几种证书
  2. 11月1日上午PHP------empty、 is_null、isset、unset的区别
  3. ScorllView中嵌套listView与Viewpager的焦点问题处理
  4. js中快速获取数组中的最大值最小值
  5. VLAN 间路由的几种方法
  6. PHP用mb_string函数库处理与windows相关中文字符
  7. cpp blog上面看到一哥们写的 下拉列表
  8. 红,X-Japan
  9. ACM题目————次小生成树
  10. bzoj 1856: [Scoi2010]字符串
  11. wifidog源码分析 - 用户连接过程
  12. N种方法妙讲LIS算法
  13. 【BZOJ3450】【Tyvj1952】Easy 可能DP
  14. bat判断当前目录是否是根目录
  15. apache:侧重于http server tomcat:侧重于servlet引擎
  16. canvas-6font.html
  17. python之面向对象的高级进阶
  18. JAVA 静态方法和实例方法的区别 (图表)
  19. SSH不能连接并提示REMOTE HOST IDENTIFICATION HAS CHANGED解决
  20. Linux(六)shell操作实用技巧

热门文章

  1. C# 强转空会不会出现异常
  2. ES基本语法
  3. lombok优缺点
  4. DEVOPS技术实践_19:Pipeline的多参数json调用
  5. alpha week 1/2 Scrum立会报告+燃尽图 06
  6. Vue-cli2.0
  7. [技术翻译]使用Nuxt生成静态网站
  8. 你对Java泛型的理解够深入吗?
  9. 【tf.keras】AdamW: Adam with Weight decay
  10. 【转】Vim显示中文乱码