@suixinhita
2017-10-25T11:55:56.000000Z
字数 4919
阅读 1133
图论
#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 longusing 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;}