@suixinhita
2017-10-25T19:55:56.000000Z
字数 4919
阅读 905
图论
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=105;
const int M=105;
struct data{
int next,to;
}e[1000005];
int head[N],gs;
char ans[N];
int in[N],n;
int len[M],cnt;
char s[M][M];
void add(int fr,int to)
{
e[++gs].to=to;e[gs].next=head[fr],head[fr]=gs;in[to]++;
}
bool topsort()
{
queue<int> q;
for(int i=1;i<=26;++i) if(!in[i]) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();ans[++cnt]='a'+u-1;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(--in[v]==0) q.push(v);
}
}
for(int i=1;i<=26;++i) if(in[i]) return 0;
return 1;
}
void solve()
{
for(int i=1;i<n;++i)
{
for(int j=i+1;j<=n;++j)
{
int l1=len[i],l2=len[j];
for(int k=1;k<=l1;++k)
if(k>l2)
{
puts("Impossible");return;
}
else if(s[i][k]!=s[j][k])
{
add(s[i][k]-'a'+1,s[j][k]-'a'+1);
break;
}
}
}
if(!topsort())
{
puts("Impossible");return;
}
for(int i=1;i<=cnt;++i) printf("%c",ans[i]);
}
int main()
{
// freopen("1.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%s",s[i]+1);
len[i]=strlen(s[i]+1);
}
solve();
return 0;
}
#include<queue>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6+5;
struct data{
int to,next;
ll v;
}e[N<<1];
int head[N],gs,n,q,x,y,v;
int in[N],out[N];
ll c[N],U[N];
void add(int fr,int to,ll v)
{
e[++gs].to=to,e[gs].next=head[fr],head[fr]=gs,e[gs].v=v,in[to]++,out[fr]++;
}
void topsort()
{
queue<int> q;
for(int i=1;i<=n;++i)
if(in[i]==0) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
c[v]+=e[i].v*c[u];
if(--in[v]==0) q.push(v),c[v]-=U[v],c[v]=c[v]<0?0:c[v];
}
}
int flag=1;
for(int i=1;i<=n;++i)
if(out[i]==0&&c[i]>0)
flag=0,printf("%d %lld\n",i,c[i]);
if(flag) puts("NULL");
}
inline int read()
{
int x=0,y=1;char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') y=-1;
c=getchar();
}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*y;
}
int main()
{
// freopen("1.txt","r",stdin);
n=read(),q=read();
for(int i=1;i<=n;++i) c[i]=read(),U[i]=read();
for(int i=1;i<=q;++i)
{
x=read(),y=read(),v=read();
add(x,y,v);
}
topsort();
return 0;
}
#include<stack>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1005;
const int inf=0x3f3f3f3f;
stack<int> s[2];
struct data{
int to,next;
}e[N];
int head[N],gs;
int a[N],col[N],n,mn[N];
void add(int fr,int to)
{
//printf("%d %d\n",fr,to);
e[++gs].to=to,e[gs].next=head[fr],head[fr]=gs;
}
void init()
{
a[n+1]=inf;
for(int i=1;i<=n+1;++i) mn[i]=inf;
for(int i=n;i>=1;--i)
mn[i]=min(mn[i+1],a[i]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
if(a[i]<a[j]&&mn[j+1]<a[i]) add(i,j),add(j,i);
memset(col,-1,sizeof(col));
}
bool dfs(int u,int c)
{
col[u]=c;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
bool flag=1;
if(col[v]==-1)
{
flag=dfs(v,c^1);
if(!flag) return 0;
}
else if(col[v]==c) return 0;
}
return 1;
}
inline int read()
{
int x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x;
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("11.txt","w",stdout);
n=read();
for(int i=1;i<=n;++i) a[i]=read();
init();
for(int i=1;i<=n;++i)
if(col[i]==-1) if(dfs(i,0)==0)
{
puts("0");return 0;
}
int now=1;s[0].push(inf),s[1].push(inf);
for(int i=1;i<=n;++i)
{
if(col[i]==0) printf("a "),s[0].push(a[i]);
else if(col[i]==1) printf("c "),s[1].push(a[i]);
while(s[0].top()==now||s[1].top()==now)
{
if(s[0].top()==now) printf("b "),s[0].pop();
else printf("d "),s[1].pop();
now++;
}
}
return 0;
}
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10005;
const int M=1000005;
const int inf=0x3f3f3f3f;
struct data{
int to,next,f;
}e[M];
int head[N],gs=1,s,t;
bool map[105][105];
int l[105][105],r[105][105],m,n;
int fx[5],fy[5];
char S[105];
void add(int fr,int to,int f)
{
// printf("%d %d\n",fr,to);
e[++gs].to=to,e[gs].f=f,e[gs].next=head[fr],head[fr]=gs;
e[++gs].to=fr,e[gs].f=0,e[gs].next=head[to],head[to]=gs;
}
int dis[N],now[N];
bool bfs()
{
queue<int> q;
memset(dis,-1,sizeof(dis));
dis[s]=0,q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(!e[i].f) continue;
if(dis[v]==-1)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
if(dis[t]==-1) return 0;
else return 1;
}
int dfs(int u,int f)
{
if(u==t) return f;
int ff,k,su=0;
for(int i=now[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]==dis[u]+1)
{
ff=min(e[i].f,f-su);
k=dfs(v,ff);
su+=k;
e[i].f-=k,e[i^1].f+=k;
if(e[i].f) now[u]=i;
if(su==f) return su;
}
}
if(!su) dis[u]=-1;
return su;
}
int dinic()
{
int an=0;
while(bfs())
{
for(int i=s;i<=t;++i) now[i]=head[i];
an+=dfs(s,inf);
}
return an;
}
void build()
{
int cntl=0,cntr=n*m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
l[i][j]=++cntl;
r[i][j]=++cntr;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=4;++k)
{
int x=i+fx[k],y=j+fy[k];
if(x<1||x>n) continue;
if(y<1||y>m) continue;
if((!map[i][j])&&(!map[x][y])) add(l[i][j],r[x][y],1);
}
s=0,t=++cntr;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(!map[i][j]) add(s,l[i][j],1),add(r[i][j],t,1);
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("11.txt","w",stdout);
int R,C;int tot=0;
scanf("%d%d%d%d",&n,&m,&R,&C);
for(int i=1;i<=n;++i)
{
scanf("%s",S+1);
for(int j=1;j<=m;++j) if(S[j]=='x') map[i][j]=1,tot++;
}
fx[1]=R,fx[2]=C,fx[3]=R,fx[4]=C;
fy[1]=C,fy[2]=R,fy[3]=-C,fy[4]=-R;
build();
int ans=dinic();
printf("%d\n",m*n-tot-ans);
return 0;
}