YES" (without quotes) if it's possible for the team 1 to score at least as much wins as any other team of its division, and "
NO" (without quotes) otherwise.
sample input |
sample output |
3 1 2 2 1 1 1 0 0 0 0 0 0 0 0 0 |
YES |
sample input |
sample output |
3 1 2 2 1 1 1 0 0 0 0 0 1 0 1 0 |
NO |
类似之前做过的一道用网络流解构造性问题方案的题目。竟然还是wa了好久,重新换一种编号方式就过了。。。以后做网络流的题目一定要把编号想的特别清楚。
#include<cstdio> #include<map> #include<queue> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<list> #include<set> #include<cmath> using namespace std; const int maxn = 1e3 + 5; const int INF = 1e9; const double eps = 1e-6; typedef unsigned long long ULL; typedef long long LL; typedef pair<int, int> P; #define fi first #define se second struct Edge { int from, to, cap, flow; }; struct Dinic { int n, m, s, t; vector<Edge> edges; // 边数的两倍 vector<int> G[maxn]; // 邻接表,G[i][j]表示结点i的第j条边在e数组中的序号 bool vis[maxn]; // BFS使用 int d[maxn]; // 从起点到i的距离 int cur[maxn]; // 当前弧指针 void ClearAll(int n) { for(int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void ClearFlow() { for(int i = 0; i < edges.size(); i++) edges[i].flow = 0; } void AddEdge(int from, int to, int cap) { //cout << from << ' ' << to << ' ' << cap << endl; edges.push_back((Edge){from, to, cap, 0}); edges.push_back((Edge){to, from, 0, 0}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; while(!Q.empty()) { int x = Q.front(); Q.pop(); for(int i = 0; i < G[x].size(); 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]; i < G[x].size(); 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; } }; Dinic g; int won[maxn]; int match[maxn][maxn]; int main(){ int n; while(scanf("%d", &n) != EOF){ bool ans = true; for(int i = 1;i <= n;i++) cin >> won[i]; for(int i = 1;i <= n;i++){ int x; cin >> x; if(i == 1) won[i] += x; else{ if(won[i] > won[1]) ans = false; } } for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ cin >> match[i][j]; } } int source = 0, sink = n*n+n+1; g.ClearAll(sink + 5); int cnt = 1; int total = 0; for(int i = 2;i <= n;i++){ for(int j = i+1;j <= n;j++){ g.AddEdge(source, cnt, match[i][j]); g.AddEdge(cnt, n*n+i, INF); g.AddEdge(cnt, n*n+j, INF); cnt++; total += match[i][j]; } } for(int i = 2;i <= n;i++){ g.AddEdge(n*n+i, sink, won[1]-won[i]); } if(g.Maxflow(source, sink) != total) ans = false; if(ans) puts("YES"); else puts("NO"); } return 0; }