B:Buggy Robot

【题意】

一个n*m的地图(1≤n, m≤50),有一个入口和一个出口。给定一个命令序列(上,下,左,右),如果碰到障碍或者边际就忽略。问至少加入或删除多少个的命令,使得能从入口走到出口。

【题解】

f[i][j][k]表示在位置(i,j),匹配到命令序列的第k项,至少加入或删除多少个的命令。

D:Contest Strategy

【题意】

一场ACM有n题,做第i题要$t_i$的时间。

有n!种读题顺序,做题策略是这样的:

1.先随机读k道题;

2.在读过的题中做用时最少的题(有多个就随便选一个)

3.从没读过的题中随机选一题(如果有的话)

4.如果还有题没有做,跳到步骤2

求n!种情况的罚时之和。

【题解】

这道题可以做到O(n)(不算排序)

容易知道第i个做出来的题系数为n-i+1

容易知道最后做出来的k-1道题一定是用时前k-1大的。

我们从后往前考虑。

先把时间从大到小排序。

改一下规则,如果在读过的题中有多个用时最少,选下标最大的。

记f[i]表示只考虑前i道题时的答案。

f[1]=t[1]

当1<i<=k时,

$f[i]=f[i-1]*i+i!*t[i]*i$

当k<i<=n时,

这道题如果一旦被读过,就一定会立刻做。

我们要算这道题的贡献和它造成其他题罚时的增量。

分两种情况考虑,

1)这道题是第1道做出来的题

2)这道题是第2...i-k+1道做出来的题目

看程序注释

 #include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const int MOD=; int n,k;
LL t[maxn],s[maxn],fact[maxn],f[maxn]; bool cmp(LL a,LL b){return a>b;} int main()
{
freopen("D.in","r",stdin);
int i;
n=gint();k=gint();
re(i,,n)t[i]=gint();
sort(t+,t+n+,cmp);
re(i,,n)s[i]=(s[i-]+t[i])%MOD;
fact[]=;re(i,,n)fact[i]=fact[i-]*i%MOD;
LL temp=;
re(i,,k-)(temp+=t[i]*i)%=MOD;
f[]=t[];
re(i,,k)f[i]=(f[i-]*i%MOD+fact[i]*t[i]%MOD*i%MOD)%MOD;
re(i,k+,n)
{
f[i]=f[i-]*i%MOD;
(f[i]+=fact[i-]*k%MOD*t[i]%MOD*i%MOD)%=MOD;//这道题是第1道做出来的题
//这道题是第2...i-k+1道做出来的题目
(f[i]+=fact[i-]*(i-+k)*(i-k)/%MOD*t[i]%MOD)%=MOD;//这道题的贡献
(f[i]+=f[i-]-(temp+(s[i-]-s[k-])*(k-))*fact[i-]%MOD)%=MOD;//它造成其他题罚时的增量
}
cout<<(f[n]%MOD+MOD)%MOD<<endl;
return ;
}

E:Enclosure

【题意】

给定n个点,问用前k个点与剩下的n-k个点建一个凸包,最大面积是多少。

【题解】

建大小两个凸包。大凸包用n个点建,小凸包用前k个点建。

然后在大凸包上跑就行了。

输出时不能强行转成double。

 #include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=; int n,k;
struct Tp
{
LL x,y;
friend LL operator *(Tp p1,Tp p2){return p1.x*p2.y-p2.x*p1.y;}
}p[maxn]; bool cmp(Tp a,Tp b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
LL det(Tp p0,Tp p1,Tp p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);} Tp sta[maxn];int top;
void graham(Tp *p,int n)
{
int i;
top=;
sort(p+,p+n+,cmp);
re(i,,n)
{
while(top> && det(sta[top-],sta[top],p[i])<=)top--;
sta[++top]=p[i];
}
int d=top;
red(i,n,)
{
while(top>d && det(sta[top-],sta[top],p[i])<=)top--;
sta[++top]=p[i];
}
top--;
} Tp q[maxn];int m;
#define L(x) (x==1?m:x-1)
#define R(x) (x==m?1:x+1)
LL solve()
{
int i;
LL S=;
q[m+]=q[];
re(i,,m)S+=q[i]*q[i+];
LL res=S,tmp=;
int l=,r=;
while(det(sta[],q[l],q[L(l)])>=)tmp+=det(q[L(l)],q[l],q[r]),l=L(l);
re(i,,top)
{
while(det(q[r],q[R(r)],sta[i])<=)tmp+=det(q[l],q[r],q[R(r)]),r=R(r);
while(det(q[l],q[R(l)],sta[i])>)tmp-=det(q[l],q[R(l)],q[r]),l=R(l);
upmax(res,S-tmp+det(sta[i],q[r],q[l]));
}
return res;
} int main()
{
freopen("E.in","r",stdin);
freopen("E.out","w",stdout);
int i;
n=gint();k=gint();
re(i,,n)p[i].x=gint(),p[i].y=gint();
graham(p,k);
m=top;
re(i,,m)q[i]=sta[i];
graham(p,n);
LL ans=solve();
cout<<(ans>>);
if(ans&)puts(".5");else puts(".0");
return ;
}

H:Paint

【题意】

一个n*n的棋盘上,有l盏灯。每盏灯可以选择在横向或者纵向的方向照,延伸范围为r。

如果一个空格在横向上被超过1盏灯照,或者在纵向上被超过1盏灯照,那么鬼就会被吓跑。

问是否存在一种方案使得鬼不会被吓跑。

【题解】

2-SAT。

 #include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=; int n,r,l;
int x[maxn],y[maxn]; int now,info[*maxn];
struct Tedge{int v,next;}edge[*maxn*maxn]; void add(int u,int v)
{
edge[++now]=(Tedge){v,info[u]};info[u]=now;
u^=;v^=;
edge[++now]=(Tedge){u,info[v]};info[v]=now;
} int cnt,dfn[*maxn],low[*maxn];
int top,sta[*maxn],vis[*maxn];
int tot,id[*maxn];
void dfs(int u)
{
dfn[u]=low[u]=++cnt;
vis[sta[++top]=u]=;
int i,v;
for(i=info[u],v=edge[i].v;i!=-;i=edge[i].next,v=edge[i].v)
if(!dfn[v])
dfs(v),upmin(low[u],low[v]);
else
if(vis[v])upmin(low[u],dfn[v]);
if(dfn[u]==low[u])
{
tot++;
while(){vis[sta[top]]=;id[sta[top--]]=tot;if(sta[top+]==u)break;}
}
} int main()
{
freopen("H.in","r",stdin);
int i,j;
n=gint();r=gint();l=gint();
re(i,,l)x[i]=gint(),y[i]=gint();
mmst(info,-);now=-;
re(i,,l)re(j,,i-)
{
if(x[i]==x[j] && abs(y[i]-y[j])<=*r)add(i<<,j<<|);
if(y[i]==y[j] && abs(x[i]-x[j])<=*r)add(i<<|,j<<);
}
re(i,,*l)if(!dfn[i])dfs(i);
re(i,,l)if(id[i<<]==id[i<<|]){printf("NO\n");return ;}
printf("YES\n");
return ;
}

G:Maximum Islands

【题意】

一块n*m的地图(1≤n, m≤40),有一些点是陆地“L”,有一些点是海洋“W”,还有一些未确定“C”。求出一种方案,使得把所有“C”变成“L”或者“W”后,陆地连通块的个数最大。

【题解】

首先,确定两点:

与“L”的“C”一定不会变成陆地“L”;

新生成的陆地面积一定是1*1

由相邻格子之间相互排斥可以奇偶二分图和最大独立集。

 #include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime>
#include<ext/rope> using namespace __gnu_cxx;
using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); //void enlargestack(){int size=256<<10;char *p=(char*)malloc(size)+size;__asm__("movl %0, %%esp\n"::"r"(p));} int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const int dx[]={,,,-};
const int dy[]={,-,,}; int n,m;
char s[maxn][maxn]; int vis[maxn][maxn];
void dfs(int x,int y)
{
vis[x][y]=;
int i;
re(i,,)
{
int tx=x+dx[i],ty=y+dy[i];
if(s[tx][ty]=='L' && !vis[tx][ty])dfs(tx,ty);
}
} int ok[maxn][maxn];
int check(int x,int y)
{
if(s[x][y]!='C')return ;
int i;
re(i,,)
{
int tx=x+dx[i],ty=y+dy[i];
if(s[tx][ty]=='L')return ;
}
return ;
} int a,b,id[maxn][maxn];
int info[maxn*maxn],now;
struct Tedge{int v,next;}edge[maxn*maxn*];
int link[maxn*maxn];
int flag[maxn*maxn]; void add(int u,int v){edge[++now]=(Tedge){v,info[u]};info[u]=now;} int dfs2(int u)
{
int i,v;
for(i=info[u],v=edge[i].v;i!=-;i=edge[i].next,v=edge[i].v)if(!flag[v])
{
flag[v]=;
if(!link[v] || dfs2(link[v])){link[v]=u;return ;}
}
return ;
}
int main()
{
freopen("G.in","r",stdin);
freopen("G.out","w",stdout);
int i,j,k;
n=gint();m=gint();
re(i,,n)scanf("%s\n",s[i]+);
int ans=;
re(i,,n)re(j,,m)if(s[i][j]=='L' && !vis[i][j])ans++,dfs(i,j);
re(i,,n)re(j,,m)ok[i][j]=check(i,j);
re(i,,n)re(j,,m)if(ok[i][j])
if (((i+j)&)==)id[i][j]=++a; else id[i][j]=++b;
mmst(info,-);now=-;
re(i,,n)re(j,,m)if(ok[i][j])
if(((i+j)&)==)
re(k,,)
{
int tx=i+dx[k],ty=j+dy[k];
if(ok[tx][ty])add(id[i][j],id[tx][ty]);
}
int res=;
re(i,,a)
{
re(j,,b)flag[j]=;
res+=dfs2(i);
}
ans+=a+b-res;
cout<<ans<<endl;
return ;
}

2017萧山第5场(2016 Pacific Northwest - Division 1)的更多相关文章

  1. 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits ...

  2. 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解

    题目链接: 2018 ICPC Pacific Northwest Regional Contest - I-Inversions 题意 给出一个长度为\(n\)的序列,其中的数字介于0-k之间,为0 ...

  3. 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) S Surf

    SurfNow that you've come to Florida and taken up surng, you love it! Of course, you've realized that ...

  4. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) K Tournament Wins

    题目链接:http://codeforces.com/gym/101201 /* * @Author: lyucheng * @Date: 2017-10-22 14:38:52 * @Last Mo ...

  5. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution

    A:Alphabet Solved. 签. #include<bits/stdc++.h> using namespace std; ]; ]; int main(){ scanf(); ...

  6. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Problem K Tournament Wins

    Problem K — limit 1 second Tournament Wins 这个题就是有2^n队伍,他现在的实力水平是第k位,采用的是淘汰制 问一下你他的胜场数的期望 这人能 win> ...

  7. 【进阶——最小费用最大流】hdu 1533 Going Home (费用流)Pacific Northwest 2004

    题意: 给一个n*m的矩阵,其中由k个人和k个房子,给每个人匹配一个不同的房子,要求所有人走过的曼哈顿距离之和最短. 输入: 多组输入数据. 每组输入数据第一行是两个整型n, m,表示矩阵的长和宽. ...

  8. [CFgym]2015-2016 ACM-ICPC Pacific Northwest Regional Contest小结

    *感谢两位浙江大佬带我飞 贴下成绩 div2 div1 *div2不是我打的上个厕所就5/11了 比赛小结 A [题目大意] 有n(n<=500)个机场,两两之间距离是g[i][j],每经停一个 ...

  9. 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    A. Odd Palindrome 所有回文子串长度都是奇数等价于不存在长度为$2$的偶回文子串,即相邻两个字符都不同. #include<cstdio> #include<cstr ...

随机推荐

  1. 配置高可用集群(实验) corosyne+pacemaker

    环境准备: 一准备三个虚拟机,把/etc/hosts/文件配置好                              192.168.43.9 node0                     ...

  2. maven执行"mvn clean package" 命令报错

    昨天利用mvn打包,执行程序'mvn clean package' 命令,发现打包失败 问题描述 具体看代码 发信tomcat下的log 清除不掉.为什么呢?忽然想起来我的项目服务还起着,于是我把服务 ...

  3. [OS] 内核态和用户态的区别

    http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个 ...

  4. Win10系统 安装Anaconda+TensorFlow+Keras

    小白一枚,安装过程走了很多坑,前前后后安装了好几天,因此记录一下. 一.安装anaconda 官方下载地址:https://repo.continuum.io/archive/ 选项相应的版本安装,我 ...

  5. LDA-Latent Dirichlet Allocation 学习笔记

    以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dir ...

  6. P1110 [ZJOI2007]报表统计

    题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一张报表实际上是维护一个非负整数数列,并 ...

  7. What Kind of Friends Are You? ZOJ - 3960(ZheJiang Province Contest)

    怎么说呢...我能说我又过了一道水题? emm... 问题描述: 给定 n 个待确定名字的 Friends 和 q 个问题.已知 c 个 Friends 的名字. 对于第 i 个问题,有  个 Fri ...

  8. MT【126】点对个数两题之二【图论】

    在平面上有\(n\) 个点$S={x_1,x_2\cdots,x_n}, $ 证明在这 \(n\) 个点中距离为 \(1\) 的点对数不超过 \(\dfrac{n}{4}+\dfrac{2}{2}n^ ...

  9. 【Cf #290 C】Fox And Dinner(最大流)

    如果要相邻两个数(a[i] >= 2)相加为质数,显然它们的奇偶性不同,也就是说一个圆桌(环)必须是偶环. 也就是答案的若干个环组成了一张二分图,其中以奇偶分色. 考虑每个点的度数一定为2,用最 ...

  10. BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】

    题目链接 BZOJ4727 题解 前置芝士 1.竞赛图存在哈密顿路径 2.竞赛图存在哈密顿回路,当且仅当它是强联通的 所以我们将图缩点后,拓扑排序后一定是一条链,且之前的块内的点和之后块内的点的边一定 ...