4086: [Sdoi2015]travel
Time Limit: 80 Sec Memory Limit: 512 MB
Submit: 54 Solved: 27
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
题面去Vijos看.
对每种k需要单独设计一个算法….
主要是要用考虑对方案进行容斥…
感觉doc老师博客里给的标算其实本质也是容斥?
因为为了压代码牺牲了代码的常数,导致跑的特别慢呢..
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define MAXN 1010
#define MAXM 10010
#define GET (ch>='0'&&ch<='9')
using namespace std;
inline void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
int T,n,m,k,top,sum,tot;
int a[MAXN][MAXN],l[MAXN][MAXN],cnt[MAXN],num[MAXN][MAXN],mat[MAXN][MAXN];
int c1[MAXN][MAXN],c2[MAXN][MAXN];
vector<int> c[MAXN][MAXN];
struct edge { int to; edge *next; }e[MAXM],*prev[MAXN];
inline void insert(int u,int v) { e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top]; }
inline void solve_2()
{
for (register int i=1;i<=n;++i) for (register int j=1;j<=n;++j) l[i][j]|=a[i][j];
}
inline void solve_3()
{
for (register int x=1;x<=n;x++)
for (register edge *i=prev[x];i;i=i->next) for (register edge *j=prev[i->to];j;j=j->next)
if (j->to!=x) l[x][j->to]=1;
}
inline void solve_4()
{
for (register int i=1;i<=n;++i) for (register int j=i+1;j<=n;++j)
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next)
if (J->to!=I->to&&J->to!=i) l[i][j]=(l[j][i]|=a[I->to][J->to]);
}
inline void solve_5()
{
for (register int i=1;i<=n;++i) for (register int j=i+1;j<=n;++j)
{
for (int k=1;k<=n;++k) cnt[k]=0;sum=0;
for (register edge *I=prev[i];I;I=I->next) if (I->to!=j&&a[I->to][j]) ++cnt[I->to],++sum;
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next)
if (J->to!=i&&J->to!=I->to) l[I->to][J->to]=(l[J->to][I->to]|=(sum-cnt[I->to]-cnt[J->to]>0));
}
}
inline void solve_6()
{
for (register int i=1;i<=n;++i) for (register int j=i+1;j<=n;++j)
{
for (register int k=1;k<=n;++k) cnt[k]=0;sum=0;
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next) if (J->to!=i&&I->to!=J->to&&a[I->to][J->to]) ++cnt[I->to],++cnt[J->to],++sum;
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next)
if (J->to!=i&&I->to!=J->to) l[I->to][J->to]=(l[J->to][I->to]|=(sum-cnt[I->to]-cnt[J->to]+a[I->to][J->to]>0));
}
}
inline void solve_7()
{
for (register int i=1;i<=n;++i) for (register int j=1;j<=n;++j) c[i][j].clear(),num[i][j]=mat[i][j]=0;
for (register int x=1;x<=n;++x)
for (register edge *i=prev[x];i;i=i->next) for (edge *j=prev[i->to];j;j=j->next)
if (j->to!=x) c[x][j->to].push_back(i->to);
for (register int i=1;i<=n;++i) for (register int j=i+1;j<=n;++j)
{
for (register int k=1;k<=n;++k) cnt[k]=0;++tot;sum=0;
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next)
if (J->to!=i&&J->to!=I->to)
for (register int k=c[I->to][J->to].size()-1;~k;k--)
{
int t=c[I->to][J->to][k];
if (t==i||t==j) continue;
if (num[I->to][J->to]==tot) ++c1[I->to][J->to];
else c1[I->to][J->to]=1,num[I->to][J->to]=tot;
if (mat[I->to][t]==tot) ++c2[I->to][t];
else c2[I->to][t]=1,mat[I->to][t]=tot;
if (mat[J->to][t]==tot) ++c2[J->to][t];
else c2[J->to][t]=1,mat[J->to][t]=tot;
++cnt[I->to];++cnt[J->to];++cnt[t];++sum;
}
for (register edge *I=prev[i];I;I=I->next)
if (I->to!=j)
for (register edge *J=prev[j];J;J=J->next)
if (J->to!=I->to&&J->to!=i) l[I->to][J->to]=(l[J->to][I->to]|=(sum-cnt[I->to]-cnt[J->to]+(num[I->to][J->to]==tot?c1[I->to][J->to]:0)+(mat[I->to][J->to]==tot?c2[I->to][J->to]:0)+(mat[J->to][I->to]==tot?c2[J->to][I->to]:0)>0));
}
}
int main()
{
for (in(T);T;T--)
{
in(n);in(m);in(k);int u,v;top=0;
for (register int i=1;i<=n;++i) prev[i]=0x0;
for (register int i=1;i<=n;++i) for (int j=1;j<=n;++j) a[i][j]=l[i][j]=0;
for (register int i=1;i<=m;++i) in(u),in(v),insert(u,v),insert(v,u),a[u][v]=a[v][u]=1;
if (k==2) solve_2();
if (k==3) solve_3();
if (k==4) solve_4();
if (k==5) solve_5();
if (k==6) solve_6();
if (k==7) solve_7();
for (register int i=1;i<=n;++i)
{
for (register int j=1;j<=n;++j) putchar(l[i][j]?'Y':'N');
putchar('\n');
}
}
}