暑假集训day6
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假集训day6相关的知识,希望对你有一定的参考价值。
其实这是昨天的事了。(现在时间回到一天前)
今天主要就是考试了,可以算是半期考。
我做了2题。。。有点少
次短路问题:9018_2095
题意简述,给你一幅图,求出次短路
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cstdio> using namespace std; inline int read(){ int num=0,t=1;char c=getchar(); while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){num=(num<<3)+(num<<1)+c-\'0\';c=getchar();} return num*t; } const int maxn=5005,INF=1e9; int n,m,d[maxn],d2[maxn]; struct edge{int to,c;};vector<edge>g[maxn]; typedef pair<int,int>P; void add(int f,int t,int c){ g[f].push_back((edge){t,c}); g[t].push_back((edge){f,c}); } void solve(){ priority_queue< P,vector<P>,greater<P> >q; fill(d,d+n,INF);fill(d2,d2+n,INF); q.push(P(0,0));d[0]=0; while(!q.empty()) { P p=q.top();q.pop(); int v=p.second,dis=p.first; if(d2[v]<dis)continue; for(int i=0;i<g[v].size();i++){ edge e=g[v][i];int dis2=dis+e.c; if(d[e.to]>dis2) swap(d[e.to],dis2),q.push(P(d[e.to],e.to)); if(d2[e.to]>dis2&&d[e.to]<dis2) d2[e.to]=dis2,q.push(P(d2[e.to],e.to)); } } printf("%d\\n",d2[n-1]); } int main(){ n=read();m=read(); for(int i=1;i<=m;i++){ int a=read(),b=read(),c=read();add(a-1,b-1,c); }solve(); return 0; }
保卫萝卜 9018_2101
二分加网络流即可
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #define For(i,a,b) for(int i=a;i<=b;i++) using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){num=(num<<3)+(num<<1)+c-\'0\';c=getchar();} return num*t; } const int INF=10000010,mn=111; const double eps=1e-5; struct edge{int to;double c;int rev;}; vector<edge> g[mn]; int iter[mn],level[mn]; void add(int f,int t,double c){ g[f].push_back((edge){t,c,g[t].size()}); g[t].push_back((edge){f,0,g[f].size()-1}); } void bfs(int s){ memset(level,0,sizeof(level)); queue<int>q; level[s]=1;q.push(s); while(!q.empty()){ int v=q.front();q.pop(); for(int i=0;i<g[v].size();i++){ edge &e=g[v][i]; if(e.c>0&&level[e.to]==0){ level[e.to]=level[v]+1; q.push(e.to); } } } } double dfs(int v,int t,double f){ if(v==t) return f; for(int &i=iter[v];i<g[v].size();i++){ edge &e=g[v][i]; if(e.c>0&&level[v]+1==level[e.to]){ double d=dfs(e.to,t,min(f,e.c)); if(d>0){ e.c-=d; g[e.to][e.rev].c+=d; return d; } } } return 0; } double flow(int s,int t){ double flow=0; while(1){ bfs(s); if(level[t]==0) return flow; memset(iter,0,sizeof(iter)); double f; while((f=dfs(s,t,INF))>0)flow+=f; } } int n,m,a[51],b[51],c[51][51],s=0,t=mn-2,tot=0; double check(double num){ for(int i=0;i<mn;i++)g[i].clear(); for(int i=1;i<=m;i++)add(s,i,num*(double)(b[i])); for(int i=1;i<=n;i++)add(i+m,t,(double)(a[i])); for(int i=1;i<=m;i++)for(int j=1;j<=n;j++) if(c[i][j])add(i,j+m,(double)(INF)); double x=flow(s,t); return x; } void erfen(double l,double r){ double mid; while(r-l>eps){ mid=(l+r)/2.0; if(check(mid)==(double)tot)r=mid; else l=mid; } printf("%.3lf\\n",mid); } int main() { n=read();m=read(); for(int i=1;i<=n;i++)a[i]=read(),tot+=a[i]; for(int i=1;i<=m;i++)b[i]=read(); for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)c[i][j]=read(); erfen(0,double(tot)); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于暑假集训day6的主要内容,如果未能解决你的问题,请参考以下文章