【BZOJ】【1927】【SDOI2010】星际竞速

网络流/费用流



  比较简单的一题,对于每个星球,将它拆成两个点,然后二分图建模:左部结点与S相连,流量为1费用为0;右部结点与T相连,流量为1费用为0;对于每条航道x->y,连边x->y+n,流量为1,费用为w[i]。

  那么瞬移到某个星球呢?直接连S->n+i,容量为1费用为a[i]。

(建图描述的已经比较清晰了,我就不给大家配图了,自己手画一下就行,很简单的)

  因为是最大流,所以每个星球一定都经过了(每个右部结点都流过了),而每个星球都是从花费最少的那条路径过来的!

  这题由于每个星球都必须经过,且有瞬移的存在,所以其实就是一个贪心,找出到达每个点的最小代价即可(这里的到达就走一步……比如星球4可以从星球2过来,那么就光考虑瞬移a[4]和由2过来的航道w[i]这两个权值即可)

  1 /**************************************************************
  2     Problem: 1927
  3     User: Tunix
  4     Language: C++
  5     Result: Accepted
  6     Time:3148 ms
  7     Memory:5988 kb
  8 ****************************************************************/
  9
 10 //BZOJ 1927
 11 #include<vector>
 12 #include<cstdio>
 13 #include<cstring>
 14 #include<cstdlib>
 15 #include<iostream>
 16 #include<algorithm>
 17 #define rep(i,n) for(int i=0;i<n;++i)
 18 #define F(i,j,n) for(int i=j;i<=n;++i)
 19 #define D(i,j,n) for(int i=j;i>=n;--i)
 20 #define pb push_back
 21 using namespace std;
 22 inline int getint(){
 23     int v=0,sign=1; char ch=getchar();
 24     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
 25     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
 26     return v*sign;
 27 }
 28 const int N=1610,M=200000,INF=~0u>>2;
 29 typedef long long LL;
 30 /******************tamplate*********************/
 31 int a[N],n,m,ans;
 32 struct edge{int from,to,v,c;};
 33 struct Net{
 34     edge E[M];
 35     int head[N],next[M],cnt;
 36     void ins(int x,int y,int z,int c){
 37         E[++cnt]=(edge){x,y,z,c};
 38         next[cnt]=head[x]; head[x]=cnt;
 39     }
 40     void add(int x,int y,int z,int c){
 41         ins(x,y,z,c); ins(y,x,0,-c);
 42     }
 43     int from[N],Q[M],d[N],S,T;
 44     bool inq[N],sign;
 45     bool spfa(){
 46         int l=0,r=-1;
 47         F(i,1,T) d[i]=INF;
 48         d[S]=0; Q[++r]=S; inq[S]=1;
 49         while(l<=r){
 50             int x=Q[l++];
 51             inq[x]=0;
 52             for(int i=head[x];i;i=next[i])
 53                 if(E[i].v>0 && d[x]+E[i].c<d[E[i].to]){
 54                     d[E[i].to]=d[x]+E[i].c;
 55                     from[E[i].to]=i;
 56                     if (!inq[E[i].to]){
 57                         Q[++r]=E[i].to;
 58                         inq[E[i].to]=1;
 59                     }
 60                 }
 61         }
 62         return d[T]!=INF;
 63     }
 64     void mcf(){
 65         int x=INF;
 66         for(int i=from[T];i;i=from[E[i].from])
 67             x=min(x,E[i].v);
 68         for(int i=from[T];i;i=from[E[i].from]){
 69             E[i].v-=x;
 70             E[i^1].v+=x;
 71         }
 72         ans+=x*d[T];
 73     }
 74     void init(){
 75         n=getint(); m=getint(); cnt=1;
 76         S=0; T=n*2+1;
 77         F(i,1,n){
 78             a[i]=getint();
 79             add(S,n+i,1,a[i]);
 80             add(S,i,1,0);
 81             add(n+i,T,1,0);
 82         }
 83         int x,y,z;
 84         F(i,1,m){
 85             x=getint(); y=getint(); z=getint();
 86             if (x>y) swap(x,y);
 87             add(x,y+n,1,z);
 88         }
 89         while(spfa()) mcf();
 90         printf("%d\n",ans);
 91     }
 92 }G1;
 93 int main(){
 94 #ifndef ONLINE_JUDGE
 95     freopen("1927.in","r",stdin);
 96     freopen("1927.out","w",stdout);
 97 #endif
 98     G1.init();
 99     return 0;
100 }

时间: 2024-10-26 00:54:23

【BZOJ】【1927】【SDOI2010】星际竞速的相关文章

bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Status][Discuss] Description 10 年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一. 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值.大赛要求车手们从一

BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)

拆点,费用流... ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define rep( i, n ) for( int i = 0; i < n; +

BZOJ 1927: [Sdoi2010]星际竞速 费用流

1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1927 Description 10 年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一. 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值.大赛要

bzoj 1927: [Sdoi2010]星际竞速

1 #include<cstdio> 2 #include<iostream> 3 #define M 1605 4 #define S 3000005 5 using namespace std; 6 int q[S],f[M],n,m,ans,a[M],head[M],next[S],u[S],v[S],c[S],fr[S],cnt=1,d[M],fro[M],T; 7 void jia(int a1,int a2,int a3,int a4) 8 { 9 cnt++; 10

bzoj 1927 [Sdoi2010]星际竞速【最小费用最大流】

果然还是不会建图- 设\( i \)到\( j \)有通路,代价为\( w[i][j] \),瞬移到i代价为\( a[i] \),瞬移到i代价为\( a[j] \),逗号前是流量. 因为每个点只能经过一次,所以流量限制为1,注意到从s开始很难保证出发点不同,所以但是又有联通条件,所以考虑每个扩展过的点(实际不用考虑反正早晚要扩展到)只向外扩展一个点,也就是每次只选两个联通的点(包括瞬移可达) 拆点的作用是加上费用,\( s \)到所有\( i \)连流量1费用0的边,所有\(i \)向t连流量1

1927: [Sdoi2010]星际竞速

1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2040  Solved: 1257[Submit][Status][Discuss] Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一.赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值.大赛要求车手们从一颗与这N颗行

【BZOJ】1927: [Sdoi2010]星际竞速(二分图+费用流)

http://www.lydsy.com/JudgeOnline/problem.php?id=1927 好神的题!!!!!!!!!!!!!!!!!!! 拆点后变成二分图,其实我们要求的就是类似路径覆盖这样的东西!! 只不过是加了权的.. 建图: 源向i+n连容量1,费用为能力爆发的费用 源向i连容量1,费用为0 i+n向汇连容量1,费用0 如果有边x<y,连x到y+n容量为1,费用为时间 然后跑最小费用最大流 为什么这样就行了呢? 首先,最大流一定是一个对n个点的路径覆盖(即覆盖掉所有的附加点

BZOJ:1927: [Sdoi2010]星际竞速

题解:最小费用流+二分图模型: 左边表示出这个点,右边表示入这个点: #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; const int maxn=10009; const int inf=1000000000; int n,m; int a[maxn]; struct Edge{

bzoj1927: [Sdoi2010]星际竞速

跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) #define op() clr(head

【BZOJ 1927】 [Sdoi2010]星际竞速

Description 10 年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一. 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值.大赛要求车手们从一颗与这 N 颗行星之间没有任何航路的 天体出发,访问这 N 颗行星每颗恰好一次,首先完成这一目标的人获得胜利. 由于赛制非常开放,很多人驾驶着千奇百怪的自制赛车来参赛.这次悠悠驾 驶的赛车名为超能电驴,这是一部凝聚了全银河最