[BZOJ4086][Sdoi2015]travel && 暴力

来源:互联网 发布:中国移动两张网络 编辑:程序博客网 时间:2024/06/04 18:19

分别讨论K=2到K=7 吐血 膜富爷的题解

#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<iostream>#define SF scanf#define PF printfusing namespace std;typedef long long LL;inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar(); }return x*f;}const int MAXN = 1000;const int MAXM = 5000;struct Node {int v, next;} Edge[MAXM*2+10];int adj[MAXN+10], ecnt;void addedge(int u, int v) {Node &e = Edge[++ecnt];e.v = v; e.next = adj[u]; adj[u] = ecnt;}int n, m, K;void init() {memset(adj, 0, sizeof(adj));ecnt = 0;}int vis[MAXN+10], pai[MAXN+10][MAXN+10];bool ok[MAXN+10][MAXN+10], G[MAXN+10][MAXN+10];void work2() {for(int u = 1; u <= n; u++)for(int i = adj[u]; i; i = Edge[i].next)ok[u][Edge[i].v] = true;}void work3() {for(int u = 1; u <= n; u++)for(int i = adj[u]; i; i = Edge[i].next)for(int j = adj[u]; j; j = Edge[j].next) {int v1 = Edge[i].v, v2 = Edge[j].v;if(v1 != v2) ok[v1][v2] = true;}}void work4() {for(int u = 1; u <= n; u++)for(int v = u+1; v <= n; v++) {if(u == v) continue;int x, y;for(int i = adj[u]; i; i = Edge[i].next) {for(int j = adj[v]; j; j = Edge[j].next) {x = Edge[i].v; y = Edge[j].v;if(G[x][y] && x != y && x != v && y != u ) {ok[v][u] = ok[u][v] = true;break;}}if(ok[u][v]) break;}}}void work5() {for(int u = 1; u <= n; u++)for(int v = u+1; v <= n; v++) {int tot = 0;for(int i = adj[u]; i; i = Edge[i].next) {int x = Edge[i].v;if(G[x][v]) {vis[x] = 1;tot++;}}for(int i = adj[u]; i; i = Edge[i].next) for(int j = adj[v]; j; j = Edge[j].next) {int x = Edge[i].v, y = Edge[j].v;if(x == y || x == v || y == u) continue;if(tot - vis[x] - vis[y] > 0) ok[x][y] = ok[y][x] = true;}for(int i = adj[u]; i; i = Edge[i].next) vis[Edge[i].v] = 0;}}void work6() {for(int u = 1; u <= n; u++)for(int v = u+1; v <= n; v++) {int tot = 0;for(int i = adj[u]; i; i = Edge[i].next) for(int j = adj[v]; j; j = Edge[j].next) {int x = Edge[i].v, y = Edge[j].v;if(x == y || x == v || y == u) continue;if(G[x][y]) {tot++;vis[x]++; vis[y]++; }}for(int i = adj[u]; i; i = Edge[i].next) for(int j = adj[v]; j; j = Edge[j].next) {int x = Edge[i].v, y = Edge[j].v;if(x == y || x == v || y == u) continue;if(tot - vis[x] - vis[y] + (G[x][y] ? 1 : 0) > 0)ok[x][y] = ok[y][x] = true;}for(int i = adj[u]; i; i = Edge[i].next) vis[Edge[i].v] = 0;for(int i = adj[v]; i; i = Edge[i].next) vis[Edge[i].v] = 0;}}vector <int> M[MAXN+1][MAXN+1];int exist[MAXN+1][MAXN+1], middle[MAXN+1], C[MAXN+1];int Q[MAXN+10], top, Vis[MAXN+1][MAXN+1], Time;int QQ[MAXN+10], top1, QQQ[MAXN*MAXN+10][2], top2;void work7() {for(int i = 1; i <= n; i++)for(int j = i+1; j <= n; j++)M[i][j].clear();for(int u = 1; u <= n; u++) {top = 0;for(int i = adj[u]; i; i = Edge[i].next) Q[++top] = Edge[i].v;for(int i = 1; i <= top; i++)for(int j = i+1; j <= top; j++) {int x = Q[i], y = Q[j];if(x > y) swap(x, y);M[x][y].push_back(u);}}for(int u = 1; u <= n; u++) {for(int v = u+1; v <= n; v++) {int tot = 0;top1 = top2 = 0;Time++;for(int i = adj[u]; i; i = Edge[i].next)for(int j = adj[v]; j; j = Edge[j].next) {int x = Edge[i].v, y = Edge[j].v;if(x == v || x == y || y == u) continue;if(x > y) swap(x, y);if(Vis[x][y] != Time) Vis[x][y] = Time, pai[x][y] = 0;for(int k = 0; k < M[x][y].size(); k++) {int mid = M[x][y][k];if(mid == u || mid == v) { pai[x][y]++; continue; }exist[mid][x]++; exist[mid][y]++;if(!middle[mid]) QQ[++top1] = mid;middle[mid]++;QQQ[++top2][0] = mid; QQQ[top2][1] = x;QQQ[++top2][0] = mid; QQQ[top2][1] = y;C[x]++; C[y]++;tot++;}}for(int i = adj[u]; i; i = Edge[i].next)for(int j = adj[v]; j; j = Edge[j].next) {int x = Edge[i].v, y = Edge[j].v;if(x == v || x == y || y == u) continue;if(x > y) swap(x, y);int del = tot - C[x] - C[y] - middle[x] - middle[y] + exist[x][y] + exist[y][x] + (M[x][y].size() - pai[x][y]);if(del > 0)ok[x][y] = ok[y][x] = true;}for(int i = adj[u]; i; i = Edge[i].next) C[Edge[i].v] = 0;for(int i = adj[v]; i; i = Edge[i].next) C[Edge[i].v] = 0;for(int i = 1; i <= top1; i++) middle[QQ[i]] = 0;for(int i = 1; i <= top2; i++) exist[QQQ[i][0]][QQQ[i][1]] = 0;}}}int main() {int _T = read(); while(_T--) {init();memset(G, 0, sizeof(G));memset(ok, 0, sizeof(ok));n = read(); m = read(); K = read();while(m--) {int u = read(), v = read();if(u == v) continue;addedge(u,v); addedge(v,u);G[u][v] = G[v][u] = true;}if(K == 2) work2();else if(K == 3) work3();else if(K == 4) work4();else if(K == 5) work5();else if(K == 6) work6();else work7();for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++)putchar(ok[i][j] ? 'Y' : 'N');puts("");}}}/*110 12 71 22 33 51 44 52 55 66 77 88 99 1010 3*/


0 0
原创粉丝点击