[bzoj3955] [WF2013]Surely You Congest

  首先最短路长度不同的人肯定不会冲突。

  对于最短路长度相同的人,跑个最大流就行了。。当然只有一个人就不用跑了

  看起来会T得很惨。。但dinic在单位网络里是O(m*n^0.5)的...

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 const int maxn=25233,inf=1002333333;
  8 struct zs2{
  9     int too,pre,dis;
 10 }e1[100233];int tot1,last1[maxn];
 11 struct zs1{int dis,id;};
 12 priority_queue<zs1>q;
 13 bool u[maxn];
 14 int dis1[maxn];
 15 struct zs{
 16     int too,pre;bool flow;
 17 }e[533333];int tot,last[maxn];
 18 int dl[maxn];
 19 short dis[maxn];
 20 int pos[1023];
 21 int i,j,k,n,m,ans,s,t,tt,c;
 22
 23 int ra;char rx;
 24 inline int read(){
 25     rx=getchar(),ra=0;
 26     while(rx<‘0‘||rx>‘9‘)rx=getchar();
 27     while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra;
 28 }
 29
 30 bool operator <(zs1 a,zs1 b){return a.dis>b.dis;}
 31 inline void spfa(){
 32     int i,now;
 33     memset(dis1,60,(n+1)<<2),dis1[1]=0,q.push((zs1){0,1});
 34     while(!q.empty()){
 35         while(!q.empty()&&u[q.top().id])q.pop();
 36         if(q.empty())return;
 37         now=q.top().id,q.pop(),
 38         u[now]=1;
 39         for(i=last1[now];i;i=e1[i].pre)if(dis1[e1[i].too]>dis1[now]+e1[i].dis)
 40             dis1[e1[i].too]=dis1[now]+e1[i].dis,q.push((zs1){dis1[e1[i].too],e1[i].too});
 41     }
 42 }
 43 inline void insert1(int a,int b,int c){
 44     e1[++tot1].too=b,e1[tot1].dis=c,e1[tot1].pre=last1[a],last1[a]=tot1,
 45     e1[++tot1].too=a,e1[tot1].dis=c,e1[tot1].pre=last1[b],last1[b]=tot1;
 46 }
 47 bool bfs(){
 48     memset(dis,0,(n+1)<<1);
 49     int l=0,r=1,i,now;dl[1]=s,dis[s]=1;
 50     while(l<r&&!dis[t])
 51         for(i=last[now=dl[++l]];i;i=e[i].pre)if(e[i].flow&&!dis[e[i].too])
 52             dis[e[i].too]=dis[now]+1,dl[++r]=e[i].too;
 53 //  for(i=1;i<=n;i++)printf("0->%d  %d\n",i,dis[i]);
 54     return dis[t];
 55 }
 56 int dfs(int x,int mx){
 57     if(x==t)return mx;
 58     int used=0,i;bool w;
 59     for(i=last[x];i;i=e[i].pre)if(e[i].flow&&dis[e[i].too]==dis[x]+1){
 60         w=dfs(e[i].too,1);if(w){
 61             e[i].flow=0,e[i^1].flow=1,used++;
 62             if(used==mx)return mx;
 63         }
 64     }
 65     dis[x]=0;return used;
 66 }
 67 inline void insert(int a,int b,int c){//printf("  %d-->%d  %d\n",a,b,c);
 68     e[++tot].too=b,e[tot].flow=c,e[tot].pre=last[a],last[a]=tot;
 69     e[++tot].too=a,e[tot].flow=0,e[tot].pre=last[b],last[b]=tot;
 70 }
 71 inline int check(int L,int R){//printf("check:  %d--%d\n",L,R);
 72     register int i;int flow=0,j;
 73     for(i=2;i<=tt;i+=2)e[i].flow=1,e[i^1].flow=0;
 74     for(j=1;i<=tot;i+=2,j++)
 75         e[i].flow=j>=L&&j<=R,e[i^1].flow=0;
 76     while(bfs())flow+=dfs(s,inf);
 77 //  printf("flow:  %d\n",flow);
 78     return flow;
 79 }
 80 bool cmp(int a,int b){return dis1[a]<dis1[b];}
 81 int main(){
 82     n=read(),m=read(),c=read();
 83     for(i=1;i<=m;i++)j=read(),k=read(),insert1(j,k,read());
 84     for(i=1;i<=c;i++)pos[i]=read();
 85     spfa();
 86 //  for(i=1;i<=n;i++)printf("1-->%d %d\n",i,dis1[i]);
 87     s=0,t=1,tot=1;
 88     for(i=1;i<=n;i++)for(j=last1[i];j;j=e1[j].pre)
 89         if(dis1[e1[j].too]==dis1[i]+e1[j].dis)insert(e1[j].too,i,1);tt=tot;
 90     sort(pos+1,pos+1+c,cmp);
 91
 92     for(i=1;i<=c;i++)insert(s,pos[i],0);
 93     int pre;
 94     for(i=1;i<=c&&pos[i]==1;i++,ans++);
 95     for(pre=i;i<=c;i++)if(dis1[pos[i]]!=dis1[pos[i+1]]||i==c){
 96         if(pre==i)ans++;else ans+=check(pre,i);
 97         pre=i+1;
 98     }
 99     printf("%d\n",ans);
100     return 0;
101 }

dinic好优越啊...

时间: 2024-12-28 09:46:04

[bzoj3955] [WF2013]Surely You Congest的相关文章

BZOJ 3955 Surely You Congest 解题报告

首先,我们可以求出源为 $1$ 号点的最短路图以及各个点到 $1$ 号点的最短路. 然后我们考虑那些距离不同的点,是一定不会发生拥堵现象的. 然后我们就只需要考虑那些距离相同的点,就相当于做一个最大流嘛. 假设考虑与 $1$ 号节点距离为 $d$ 的点,那怎么连边,怎么设置源和汇呢? 源为 $1$ 号节点,新开一个 $n+1$ 号节点作为汇. 对于所有满足 $dist(1, x) + w(x,y) = dist(1, y)$ 的 $x,y$ 建一条 $x\rightarrow y$ 的边,容量为

Gym - 101208C 2013 ACM-ICPC World Finals C.Surely You Congest 最大流+最短路

题面 题意:给你n(2w5)个点,m条边(7w5)有k(1e3)辆车停在某些点上的,然后他们都想尽快去1号点,同时出发,同一个点不允许同时经过, 如果多辆车同时到达一个点,他们就会堵塞,这时候只能选择通过一辆车,其他车相当于就地爆炸 问最后能有多少车到1号点 题解:想象如果2辆车的最短路不相交,那么他们就互相之间没有了影响,再想象对于一般的图,如何控制度数的,显然有一个网络流的做法 可以走的边就连,度数为1,现在我们考虑每部分最短路长度相等的点集才会受到影响.如果2个点到1的最短路长度一样,那么

bzoj 3969: [WF2013]Low Power 二分

3969: [WF2013]Low Power Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3969 Description 有n个机器,每个机器有2个芯片,每个芯片可以放k个电池. 每个芯片能量是k个电池的能量的最小值. 两个芯片的能量之差越小,这个机器就工作的越好. 现在有2nk个电池,已知它们的能量,我们要把它们放在n个机器上的芯片上, 使得所有机

bzoj3969 [WF2013]Low Power

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3969 [题解] 二分答案x,贪心选取,如果选取了i个,有j对,那么要满足i<=2*j*k(不然有数就没位置放了) # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h>

【BZOJ】3971 [WF2013]Матрёшка

[算法]区间DP [题解] 参考写法:BZOJ 3971 Матрёшка 解题报告 第二个DP可以预处理mex优化到O(nM+n2),不过我懒-- 第一个DP有另一种写法:不预处理,在一个n2取出来的的区间中,枚举决策点从左到右时,保留左最小值的可保留数不严格单调递增,保留右最小值的可保留数不严格单调递减,均摊O(1). ???[细节] f[0]=0初始化 inf+inf+inf就会爆int 区间第二重循环是i=1...n-p,否则有可能爆数组边界. #include<cstdio> #in

[bzoj3953] [WF2013]Self-Assembly

将正方形视为连接字符间的边.比方说正方形上存在A+,B-,就从A-往B+连边,表示字符可以通过这个正方形进行变换. 如果能构成环的话就可以无穷大了...判环随便写个拓扑什么的... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll long long 6 #define ull unsigned long long 7

【二分贪心】Bzoj3969 [WF2013] Low Power

Description 有n个机器,每个机器有2个芯片,每个芯片可以放k个电池. 每个芯片能量是k个电池的能量的最小值. 两个芯片的能量之差越小,这个机器就工作的越好. 现在有2nk个电池,已知它们的能量,我们要把它们放在n个机器上的芯片上, 使得所有机器的能量之差的最大值最小. Input 第一行,两个正整数,n和k. 第二行,2nk个整数,表示每个电池的能量. Output 一行一个整数,表示所有机器的能量之差的最大值最小是多少. Sample Input 2 3 1 2 3 4 5 6 7

【建图+拓扑判环】BZOJ3953: [WF2013]Self-Assembly

Description 自动化学制造(Automatic Chemical Manufacturing,简称ACM)正在对一个叫自组装(self-assembly)的过程进行实验.在这个过程中,有着天然相互吸引力的分子被混合在溶液中,任由它们聚集组合成更大的结构.但是有一个问题随之出现:有时候,分子们会把自身组合成一个无限大的结构体,以至于把容器撑爆. 你需要写一个程序来判断一个给定的分子集合是否可能组合成一个无限大的结构体.为了使问题简化,你可以作以下两个假设: 1. 问题被限制在二维平面上.

8 quotes that will surely motivate you when you facing huge challenges

i don't know the key to success, but the key to failure is trying to please everybody if it scares you, it might be a good thing to try every flower must grow through dirt i said somebody should do something about that, then i realized, i am somebody