2020/8/30
英语四级一篇
四题网络流 真就万物建模
一场cf
#include"stdio.h" #include"string.h" #include"stack" #include"map" #include"math.h" #include"iostream" #include"vector" #include"queue" #include"algorithm" using namespace std; #define OK printf("\n"); #define Debug printf("this_ok\n"); #define INF 1e18 typedef long long ll; #define scanll(a,b) scanf("%lld%lld",&a,&b); #define scanl(a) scanf("%lld",&a); #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld\n",a); #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d\n",a); typedef pair<int,int> PII; inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); } return s * w; } const ll mod = 998244353; const int N = 50010,M = 300010; const double pi = acos(-1); const int inf = 1 << 29; const int dirx[4] = {-1,0,1,0}; const int diry[4] = {0,1,0,-1}; int n,m,t,s,tot; ll maxflow,sum; int head[N],ver[M],Next[M],edge[M],d[N]; queue<int> q; int visit[N]; vector<int> st,tmp; void add(int x,int y,int z){ ver[++ tot] = y; Next[tot] = head[x]; edge[tot] = z; head[x] = tot; ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot; } bool bfs(){ memset(d,0,sizeof(d)); while(q.size())q.pop(); q.push(s); d[s] = 1; while(q.size()){ int x = q.front(); q.pop(); for(int i = head[x]; i; i = Next[i]) if(edge[i] && !d[ver[i]]){ q.push(ver[i]); d[ver[i]] = d[x] + 1; if(ver[i] == t) return 1; } } return 0; } int dinic(int x,ll flow){ if(x == t) return flow; ll rest = flow,k; for(int i = head[x]; i && rest; i = Next[i]){ if(edge[i] && d[ver[i]] == d[x] + 1){ k = dinic(ver[i],min(rest,(ll)edge[i])); if(!k) d[ver[i]] = 0; edge[i] -= k; edge[i ^ 1] += k; rest -= k; } } return flow - rest; } void dfs(int x){ tmp.push_back(x); for(int i = head[x]; i ;i = Next[i]){ int y = ver[i]; if(y > n && y < s && !visit[y - n] && !edge[i]){ visit[y - n] = 1; dfs(y - n); } } } int main(){ n = read(),m = read();s = 2 * n + 1; t = 2 * n + 2; tot = 1; for(int i = 1; i <= n; i ++){ //add(i,i + n,1); add(s,i,1); add(i + n,t,1); } for(int i = 1; i <= m; i ++){ int x = read(),y = read(); add(x,y + n,1); } ll flow = 0; while(bfs()) while(flow = dinic(s,inf)) maxflow += flow; for(int i = n + 1; i <= n + n; i ++){ for(int j = head[i]; j; j = Next[j]){ if(ver[j] == t && edge[j]) st.push_back(i - n); } } //printf("dsf"); for(int i = 0; i < st.size(); i ++){ // printf("%d x",st[i]); tmp.clear(); visit[st[i]] = 1; dfs(st[i]); for(int j = 0; j < tmp.size(); j ++){ printf("%d ",tmp[j]); } printf("\n"); } printf("%lld\n",n - maxflow); } /* 3 1 2 3 2 2 6 */ #include"stdio.h" #include"string.h" #include"stack" #include"map" #include"math.h" #include"iostream" #include"vector" #include"queue" #include"algorithm" using namespace std; #define OK printf("\n"); #define Debug printf("this_ok\n"); #define INF 1e18 typedef long long ll; #define scanll(a,b) scanf("%lld%lld",&a,&b); #define scanl(a) scanf("%lld",&a); #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld\n",a); #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d\n",a); typedef pair<int,int> PII; inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); } return s * w; } const ll mod = 998244353; const int N = 50010,M = 300010; const double pi = acos(-1); const int inf = 1 << 29; const int dirx[4] = {-1,0,1,0}; const int diry[4] = {0,1,0,-1}; int n,m,t,s,tot; ll maxflow,sum; int head[N],ver[M],Next[M],edge[M],d[N]; queue<int> q; void add(int x,int y,int z){ ver[++ tot] = y; Next[tot] = head[x]; edge[tot] = z; head[x] = tot; ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot; } bool bfs(){ memset(d,0,sizeof(d)); while(q.size())q.pop(); q.push(s); d[s] = 1; while(q.size()){ int x = q.front(); q.pop(); for(int i = head[x]; i; i = Next[i]) if(edge[i] && !d[ver[i]]){ q.push(ver[i]); d[ver[i]] = d[x] + 1; if(ver[i] == t) return 1; } } return 0; } int dinic(int x,ll flow){ if(x == t) return flow; ll rest = flow,k; for(int i = head[x]; i && rest; i = Next[i]){ if(edge[i] && d[ver[i]] == d[x] + 1){ k = dinic(ver[i],min(rest,(ll)edge[i])); if(!k) d[ver[i]] = 0; edge[i] -= k; edge[i ^ 1] += k; rest -= k; } } return flow - rest; } int main(){ n = read(),m = read();s = n + m + 1; t = s + 1; tot = 1; int ans = 0; for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++){ add(i,j + n,1); } } for(int i = 1; i <= n; i ++){ int x = read(); add(s,i,x); ans += x; } for(int i = 1; i <= m; i ++){ int x = read();add(i + n,t,x); } ll flow = 0; while(bfs()) while(flow = dinic(s,inf)) maxflow += flow; if(maxflow != ans){ printf("0\n"); return 0; } printf("1\n"); for(int i = 1; i <= n; i ++){ for(int j = head[i]; j; j = Next[j]){ if(edge[j] == 0){ printf("%d ",ver[j] - n); } } printf("\n"); } } /* 3 1 2 3 2 2 6 */ #include"stdio.h" #include"string.h" #include"stack" #include"map" #include"math.h" #include"iostream" #include"vector" #include"queue" #include"algorithm" using namespace std; #define OK printf("\n"); #define Debug printf("this_ok\n"); #define INF 1e18 typedef long long ll; #define scanll(a,b) scanf("%lld%lld",&a,&b); #define scanl(a) scanf("%lld",&a); #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld\n",a); #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d\n",a); typedef pair<int,int> PII; inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); } return s * w; } const ll mod = 998244353; const int N = 50010,M = 300010; const double pi = acos(-1); const int inf = 1 << 29; const int dirx[4] = {-1,0,1,0}; const int diry[4] = {0,1,0,-1}; int n,m,t,s,tot,k; ll maxflow,sum; int head[N],ver[M],Next[M],edge[M],d[N]; queue<int> q; vector<int> st[N]; void add(int x,int y,int z){ ver[++ tot] = y; Next[tot] = head[x]; edge[tot] = z; head[x] = tot; ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot; } bool bfs(){ memset(d,0,sizeof(d)); while(q.size())q.pop(); q.push(s); d[s] = 1; while(q.size()){ int x = q.front(); q.pop(); for(int i = head[x]; i; i = Next[i]) if(edge[i] && !d[ver[i]]){ q.push(ver[i]); d[ver[i]] = d[x] + 1; if(ver[i] == t) return 1; } } return 0; } int dinic(int x,ll flow){ if(x == t) return flow; ll rest = flow,k; for(int i = head[x]; i && rest; i = Next[i]){ if(edge[i] && d[ver[i]] == d[x] + 1){ k = dinic(ver[i],min(rest,(ll)edge[i])); if(!k) d[ver[i]] = 0; edge[i] -= k; edge[i ^ 1] += k; rest -= k; } } return flow - rest; } int main(){ m = read(),n = read();s = n + m + 1; t = s + 1; tot = 1; int ans = 0; for(int i = 1; i <= m; i ++){ int x = read(); add(i + n,t,x); ans += x; } for(int i = 1; i <= n; i ++){ add(s,i,1); } for(int i = 1; i <= n; i ++){ int k = read(); while(k --){ int x = read(); add(i,x + n,1); } } ll flow = 0; while(bfs()) while(flow = dinic(s,inf)) maxflow += flow; if(maxflow != ans) printf("No Solution!\n"); else { for(int i = 1; i <= m; i ++){ printf("%d:",i); for(int x = 1; x <= n; x ++){ for(int j = head[x]; j; j = Next[j]){ if(ver[j] != i + n) continue; if(edge[j]) continue; if(ver[j] == s || ver[j] == t) continue; printf(" %d",x); } } printf("\n"); } } } /* 3 1 2 3 2 2 6 */ #include"stdio.h" #include"string.h" #include"stack" #include"map" #include"math.h" #include"iostream" #include"vector" #include"queue" #include"algorithm" using namespace std; #define OK printf("\n"); #define Debug printf("this_ok\n"); #define INF 1e18 typedef long long ll; #define scanll(a,b) scanf("%lld%lld",&a,&b); #define scanl(a) scanf("%lld",&a); #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld\n",a); #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d\n",a); typedef pair<int,int> PII; inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); } return s * w; } const ll mod = 998244353; const int N = 50010,M = 300010; const double pi = acos(-1); const int inf = 1 << 29; int n,m,t,s,tot; ll maxflow,sum; int head[N],ver[M],Next[M],edge[M],d[N]; queue<int> q; void add(int x,int y,int z){ ver[++ tot] = y; Next[tot] = head[x]; edge[tot] = z; head[x] = tot; ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot; } bool bfs(){ memset(d,0,sizeof(d)); while(q.size())q.pop(); q.push(s); d[s] = 1; while(q.size()){ int x = q.front(); q.pop(); for(int i = head[x]; i; i = Next[i]) if(edge[i] && !d[ver[i]]){ q.push(ver[i]); d[ver[i]] = d[x] + 1; if(ver[i] == t) return 1; } } return 0; } int dinic(int x,ll flow){ if(x == t) return flow; ll rest = flow,k; for(int i = head[x]; i && rest; i = Next[i]){ if(edge[i] && d[ver[i]] == d[x] + 1){ k = dinic(ver[i],min(rest,(ll)edge[i])); if(!k) d[ver[i]] = 0; edge[i] -= k; edge[i ^ 1] += k; rest -= k; } } return flow - rest; } int main(){ int T = read(); int cont = 1; while(T --){ n = read(),m = read();s = 1; t = n; memset(head,0,sizeof(head)); tot = 1; for(int i = 1; i <= m; i ++){ int x = read(),y = read(),w = read(); add(x,y,w); } ll flow = 0; maxflow = 0; while(bfs()) while(flow = dinic(s,inf)) maxflow += flow; printf("Case %d: ",cont ++); printf("%lld\n",maxflow); } } /* 3 1 2 3 2 2 6 */