4
lisbon
berlin
1500
9
lisbon london 6 1000 1100
london lisbon 6 1130 1230
lisbon paris 5 1000 1100
paris lisbon 4 1130 1230
london paris 1 1130 1300
london berlin 2 1340 1510
berlin london 2 1300 1430
paris berlin 10 1330 1500
berlin paris 9 1300 1430
Sample Output
lisbon
berlin
1500
9
lisbon london 6 1000 1100
london lisbon 6 1130 1230
lisbon paris 5 1000 1100
paris lisbon 4 1130 1230
london paris 1 1130 1300
london berlin 2 1340 1510
berlin london 2 1300 1430
paris berlin 10 1330 1500
berlin paris 9 1300 1430
Sample Output
6
最大流建模:如果以城市建图不好表示能否上航班,所以以飞行航班为点建图,自己的脑残点 时间没有化成分钟来比较大小无限wa。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<queue> #include<vector> using namespace std; const int inf = 1e9; const int maxn = 50000; typedef long long ll; struct Edge { int fr,to,cap,flow; }; struct Dinic { int n,m,s,t; vector<Edge>edges; vector<int>G[maxn+5]; bool vis[maxn+5]; int d[maxn+5],cur[maxn+5]; void Init(int n) { this->n = n; for(int i=0; i<=n; i++) G[i].clear(); edges.clear(); } void Addedge(int fr,int to,int cap) { edges.push_back((Edge) { fr,to,cap,0 }); edges.push_back((Edge) { to,fr,0,0 }); m = edges.size(); G[fr].push_back(m-2); G[to].push_back(m-1); } bool BFS() { memset(vis,0,sizeof(vis)); queue<int>Q; Q.push(s); d[s] = 0, vis[s] = 1; while(!Q.empty()) { int x = Q.front(); Q.pop(); for(int i=0,l=G[x].size(); i<l; i++) { Edge &e = edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow) { vis[e.to] = 1; d[e.to] = d[x] + 1; Q.push(e.to); } } } return vis[t]; } int DFS(int x,int a) { if(x==t||a==0) return a; int flow = 0,f; for(int &i=cur[x],l=G[x].size(); i<l ; i++) { Edge &e = edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0) { e.flow+=f; edges[G[x][i]^1].flow -=f; flow+=f; a-=f; if(a==0) break; } } return flow; } int Maxflow(int s,int t) { this->s = s, this->t = t; int flow = 0; while(BFS()) { memset(cur,0,sizeof(cur)); flow+=DFS(s,inf); } return flow; } } my; int n,m,tot,s,t,End; char name[maxn+5][25]; map<string,int>mp; struct NodeEdge { int u,v,cap,l,r; } e[maxn*2+5]; int key(char str[]) { for(int i=1;i<=tot;i++) { if(strcmp(str,name[i])==0) return i; } strcpy(name[++tot],str); return tot; } bool ok(int l,int r) { int t1 = l/100 * 60 + l%100 + 30; int t2 = r/100 * 60 + r%100; return t1<=t2; } int main() { char str1[25],str2[25]; while(~scanf("%d",&n)) { scanf("%s %s",name[1],name[2]); tot = 2; scanf("%d",&End); scanf("%d",&m); for(int i=1; i<=m; i++) { int cap,l,r,u,v; scanf("%s %s %d %d %d",str1,str2,&cap,&l,&r); u = key(str1), v = key(str2); e[i] = ((NodeEdge) { u,v,cap,l,r }); } s = 0, t = m*2+1; my.Init(m*2+1); for(int i=1; i<=m; i++) { if(e[i].u==1) my.Addedge(s,i,inf); if(e[i].v==2&&e[i].r<=End) my.Addedge(i+m,t,inf); my.Addedge(i,i+m,e[i].cap); for(int j=1;j<=m;j++) { if(e[i].v==e[j].u&&ok(e[i].r,e[j].l)) { my.Addedge(i+m,j,inf); } } } int ans = my.Maxflow(s,t); printf("%d\n",ans); } return 0; }