#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1010;
int Laxt[maxn],Next[maxn*250],To[maxn*250],cnt,n,m;
int dfn[maxn],low[maxn],times,scc_cnt,scc[maxn];
int instc[maxn],stc[maxn],top;
int ind[maxn],ans,p[maxn],ok[maxn];
void update()
{
cnt=times=scc_cnt=top=ans=0;
memset(Laxt,0,sizeof(Laxt));
memset(dfn,0,sizeof(dfn));
memset(scc,0,sizeof(scc));
memset(instc,0,sizeof(instc));
memset(stc,0,sizeof(stc));
memset(ind,0,sizeof(ind));
memset(p,0,sizeof(p));
memset(ok,0,sizeof(ok));
}
void add(int u,int v)
{
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
}
void dfs(int u)
{
dfn[u]=low[u]=++times;
stc[++top]=u; instc[u]=1;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(!dfn[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(instc[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
scc_cnt++;
while(true){
int x=stc[top--];
scc[x]=scc_cnt;
instc[x]=0;
if(x==u) break;
}
}
}
void tarjan()
{
for(int i=1;i<=n;i++)
if(!dfn[i]) dfs(i);
for(int i=1;i<=n;i++)
for(int j=Laxt[i];j;j=Next[j]){
if(scc[i]!=scc[To[j]]) {
ind[scc[To[j]]]++;
}
}
for(int i=1;i<=scc_cnt;i++){
if(ind[i]==0) ans++;
}
if(ans>m){
printf("-1
");
return ;
}
for(int i=1;i<=n;i++){
if(ind[scc[i]]==0&&p[i]==1) ok[scc[i]]=1;
}
for(int i=1;i<=scc_cnt;i++)
if(ind[i]==0&&!ok[i]) {
printf("-1
");
return ;
}
printf("%d
",ans);
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
update(); int x,y;
for(int i=1;i<=m;i++) scanf("%d",&x),p[x]=1;
for(int i=1;i<=n;i++) {
scanf("%d",&y);
for(int j=1;j<=y;j++){
scanf("%d",&x);
add(i,x);
}
}
tarjan();
} return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
int xx=0,ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
return xx*ff;
}
const int maxn=60,maxm=2010;
int N,M;
int lin[maxn],len;
struct edge{
int y,next;
}e[maxm<<1];
inline void insert(int xx,int yy){
e[++len].next=lin[xx];
lin[xx]=len;
e[len].y=yy;
}
bool vis[maxn];
void dfs(int x){
vis[x]=1;
for(int i=lin[x];i;i=e[i].next)
if(!vis[e[i].y])
dfs(e[i].y);
}
int main(){
//freopen("in","r",stdin);
while(scanf("%d %d",&N,&M)!=EOF){
int t1,t2;
memset(lin,0,sizeof(lin));len=0;
for(int i=1;i<=M;i++){
t1=read(),t2=read();
insert(t1,t2);
}
memset(vis,0,sizeof(vis));
dfs(1);
if(vis[N])
cout<<"Yes
";
else
cout<<"No
";
}
return 0;
}
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
char chr[110][110];
int dis[8][110][110],times[10],n,m;
int sx,sy,xx[4],yy[4],ex,ey,t1,t2,t3;
const int inf=0x7fffffff;
struct In
{
int opt1;
int x1;
int y1;
int stp1;
In(int i, int j,int k,int t):opt1(i), x1(j), y1(k), stp1(t){}
};
bool operator < (const In& x, const In& y)
{
return x.stp1 > y.stp1;
}
priority_queue<In>q;
void dfs()
{
while(!q.empty())
{
In tmp=q.top();q.pop();
int opt=tmp.opt1,x=tmp.x1,y=tmp.y1,stp=tmp.stp1;
if(opt==7&&x==ex&&y==ey) return ;
if(opt<7){//可以*
if(x+1<=n) {
In temp(opt,x+1,y,stp+times[opt]);
if(dis[opt][x+1][y]>stp+times[opt]) dis[opt][x+1][y]=stp+times[opt],q.push(temp);
for(int i=1;i<=3;i++){
if(x==xx[i]&&y==yy[i]&&!((opt>>(i-1))&1)) {
In temp(opt+(1<<(i-1)),x+1,y,stp+times[opt+(1<<(i-1))]);
if(dis[opt+(1<<(i-1))][x+1][y]>stp+times[opt+(1<<(i-1))]) dis[opt+(1<<(i-1))][x+1][y]=stp+times[opt+(1<<(i-1))],q.push(temp);
}
}
}
if(x-1>=1){
In temp(opt,x-1,y,stp+times[opt]);
if(dis[opt][x-1][y]>stp+times[opt]) dis[opt][x-1][y]=stp+times[opt],q.push(temp);
for(int i=1;i<=3;i++){
if(x==xx[i]&&y==yy[i]&&!((opt>>(i-1))&1)) {
In temp(opt+(1<<(i-1)),x-1,y,stp+times[opt+(1<<(i-1))]);
if(dis[opt+(1<<(i-1))][x-1][y]>stp+times[opt+(1<<(i-1))]) dis[opt+(1<<(i-1))][x-1][y]=stp+times[opt+(1<<(i-1))],q.push(temp);
}
}
}
if(y-1>=1){
In temp(opt,x,y-1,stp+times[opt]);
if(dis[opt][x][y-1]>stp+times[opt]) dis[opt][x][y-1]=stp+times[opt],q.push(temp);
for(int i=1;i<=3;i++){
if(x==xx[i]&&y==yy[i]&&!((opt>>(i-1))&1)) {
In temp(opt+(1<<(i-1)),x,y-1,stp+times[opt+(1<<(i-1))]);
if(dis[opt+(1<<(i-1))][x][y-1]>stp+times[opt+(1<<(i-1))]) dis[opt+(1<<(i-1))][x][y-1]=stp+times[opt+(1<<(i-1))],q.push(temp);
}
}
}
if(y+1<=m){
In temp(opt,x,y+1,stp+times[opt]);
if(dis[opt][x][y+1]>stp+times[opt]) dis[opt][x][y+1]=stp+times[opt],q.push(temp);
for(int i=1;i<=3;i++){
if(x==xx[i]&&y==yy[i]&&!((opt>>(i-1))&1)) {
In temp(opt+(1<<(i-1)),x,y+1,stp+times[opt+(1<<(i-1))]);
if(dis[opt+(1<<(i-1))][x][y+1]>stp+times[opt+(1<<(i-1))]) dis[opt+(1<<(i-1))][x][y+1]=stp+times[opt+(1<<(i-1))],q.push(temp);
}
}
}
}
else {//走路
if(x+1<=n&&chr[x+1][y]=='.') {
In temp(opt,x+1,y,stp+times[opt]);
if(dis[opt][x+1][y]>stp+times[opt]) dis[opt][x+1][y]=stp+times[opt],q.push(temp);
}
if(x-1>=1&&chr[x-1][y]=='.'){
In temp(opt,x-1,y,stp+times[opt]);
if(dis[opt][x-1][y]>stp+times[opt]) dis[opt][x-1][y]=stp+times[opt],q.push(temp);
}
if(y-1>=1&&chr[x][y-1]=='.'){
In temp(opt,x,y-1,stp+times[opt]);
if(dis[opt][x][y-1]>stp+times[opt]) dis[opt][x][y-1]=stp+times[opt],q.push(temp);
}
if(y+1<=m&&chr[x][y+1]=='.'){
In temp(opt,x,y+1,stp+times[opt]);
if(dis[opt][x][y+1]>stp+times[opt]) dis[opt][x][y+1]=stp+times[opt],q.push(temp);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",chr[i]+1);
for(int i=0;i<=7;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
dis[i][j][k]=inf;
scanf("%d%d%d%d%d%d%d%d%d%d",&sx,&sy,&xx[1],&yy[1],&xx[2],&yy[2],&xx[3],&yy[3],&ex,&ey);
scanf("%d%d%d",&t1,&t2,&t3);
times[0]=1; times[1]=1+t1;times[2]=1+t2;times[3]=1+t1+t2;
times[4]=1+t3;times[5]=1+t1+t3;times[6]=1+t2+t3;times[7]=1+t1+t2+t3;
In tmp(0,sx,sy,0);
q.push(tmp);
dfs();
printf("%d
",dis[7][ex][ey]);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
int xx=0,ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
return xx*ff;
}
int main(){
int num[8]={1,2,3,4,5,6,7,8};
do{
for(int i=0;i<7;i++)
printf("%d ",num[i]);
printf("%d",num[7]);
puts("");
}while(next_permutation(num,num+8));
return 0;
}