2019HDU first multi-school

1004.Vacation

Transmission: http://acm.hdu.edu.cn/showproblem.php?pid=6581

Meaning of the questions: an intersection, you have $ n $ in front of the car, give each vehicle car length, the distance from the intersection, and the maximum speed of each vehicle. This requires $ n + 1 $ so by car, ask your front spend much time by the intersection.

Data range: $ 1 <= n <= 10 ^ 5,1 <= s_i, v_i, l_i <= 10 ^ 9 $.

analysis:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int maxn=1e5+7;
 5 struct node{int l,s,v;ll len;} p[maxn];
 6 int main()
 7 {
 8     int n;
 9     while (~scanf("%d",&n))
10     {
11         for (int i=0;i<=n;i++) p[i].l=p[i].s=p[i].v=p[i].len=0;
12         for (int i=0;i<=n;i++) scanf("%d",&p[i].l);
13         for (int i=0;i<=n;i++) scanf("%d",&p[i].s);
14         for (int i=0;i<=n;i++) scanf("%d",&p[i].v);
15         for (int i=1;i<=n;i++) p[i].len+=p[i-1].len+1ll*p[i].l;
16         for (int i=1;i<=n;i++) p[i].len+=1ll*p[i].s;
17         p[0].len=p[0].s;
18         double ans=0.0;
19         for (int i=0;i<=n;i++) ans=max(ans,1.0*p[i].len/(1.0*p[i].v));
20         printf("%.10f\n",ans);
21     }
22     return 0;
23 }
1004

1005.Path

Transmission: http://acm.hdu.edu.cn/showproblem.php?pid=6582

The meaning of problems: there are n-$ $ point, $ m $ road required to cut off the passage, such that from $ $ 1-n is larger than the shortest path of minimum cost. Every road cut costs is the length of each road.

Data range: $ 1 <= n, m <= 10 ^ 5,1 <= c <= 10 ^ 9 $.

Analysis: The subject of the request is to remove some way, so that the shortest path is not established. Running all of the selected shortest shortest side, and then run with these edges to the minimum cut.

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #define en '\n'
  7 #define low(x) (x)&(-x)
  8 #define m(a,b) memset(a,b,sizeof a)
  9 using namespace std;
 10 typedef long long ll;
 11 const int N=2e4+10,M=N;
 12 const ll INF=1e18;
 13 struct Edge{int to;ll len;int nex;}e[M],edge[M<<1];
 14 struct node{int x,y;ll c;}p[M];
 15 int head[N],tot,head2[N],ttt,n,m;
 16 void add(int from,int to,ll len)
 17 {
 18     edge[++tot]=(Edge){to,len,head[from]};head[from]=tot;
 19     edge[++tot]=(Edge){from,0,head[to]};head[to]=tot;
 20 }
 21 void add_edge(int from,int to,ll len){
 22     e[++ttt]=(Edge){to,len,head2[from]};head2[from]=ttt;
 23 }
 24 priority_queue<pair<ll,int>>Q;
 25 ll d[N],da[N],db[N];
 26 void dijkstra(int s)
 27 {
 28     for (int i=0;i<=n;i++) d[i]=INF;
 29     d[s]=0;Q.push(make_pair(0,s));
 30     while(!Q.empty())
 31     {
 32         int x=Q.top().second;Q.pop();
 33         for(int i=head2[x];i;i=e[i].nex)
 34         {
 35             int y=e[i].to;ll z=e[i].len;
 36             if(d[y]>d[x]+z)
 37             {
 38                 d[y]=d[x]+z;
 39                 Q.push(make_pair(-d[y],y));
 40             }
 41         }
 42     }
 43 }
 44 int s,t;
 45 queue<int>q;
 46 bool bfs()
 47 {
 48     for (int i=0;i<=n;i++) d[i]=0;
 49     while(!q.empty())q.pop();
 50     q.push(s);d[s]=1;
 51     while(!q.empty())
 52     {
 53         int x=q.front();q.pop();
 54         for(int i=head[x];i;i=edge[i].nex)
 55         {
 56             int y=edge[i].to;ll l=edge[i].len;
 57             if(!d[y]&&l)
 58             {
 59                 q.push(y),d[y]=d[x]+1;
 60                 if(y==t) return 1;
 61             }
 62         }
 63     }
 64     return 0;
 65 }
 66 ll dinic(int x,ll flow)
 67 {
 68     if(x==t) return flow;
 69     ll res=flow,k;
 70     for(int i=head[x];i&&res;i=edge[i].nex)
 71     {
 72         int y=edge[i].to;ll l=edge[i].len;
 73         if(l&&d[y]==d[x]+1)
 74         {
 75             k=dinic(y,min(res,l));
 76             if(!k){d[y]=0;continue;}
 77             edge[i].len-=k,edge[i^1].len+=k,res-=k;
 78         }
 79     }
 80     return flow-res;
 81 }
 82 int main()
 83 {
 84     int T;scanf("%d",&T);
 85     while(T--)
 86     {
 87         scanf("%d%d",&n,&m);
 88         for (int i=0;i<=n;i++) head[i]=0,head2[i]=0;
 89         ttt=0;tot=1;
 90         for(int i=1;i<=m;++i)
 91         {
 92             scanf("%d%d%lld",&p[i].x,&p[i].y,&p[i].c);
 93             add_edge(p[i].x,p[i].y,p[i].c);
 94         }
 95         dijkstra(1);
 96         if(d[n]==INF) {puts("0");continue;}
 97         for (int i=0;i<=n;i++) da[i]=d[i],head2[i]=0;
 98         ttt=0;
 99         for(int i=1;i<=m;++i) add_edge(p[i].y,p[i].x,p[i].c);
100         dijkstra(n);
101         for (int i=1;i<=n;i++) db[i]=d[i];
102         for(int i=1;i<=m;++i)
103         {
104             if(da[p[i].x]+db[p[i].y]+p[i].c==da[n])
105                 add(p[i].x,p[i].y,p[i].c);
106         }
107         for (int i=0;i<=n;i++) d[i]=0;
108         s=1,t=n;
109         ll maxflow=0;
110         while(bfs()) maxflow+=dinic(s,INF);
111         printf("%lld\n",maxflow);
112     }
113 }
1005

 

Guess you like

Origin www.cnblogs.com/changer-qyz/p/11233672.html