标签:inf mit print import ini outline bit stdout 正整数
roundtable.in
输出文件:roundtable.out
评测插件
4 5 4 5 3 5 3 5 2 6 4roundtable.out
1 1 2 4 5 1 2 3 4 5 2 4 5 1 2 3 4 5
分析:
比较裸的二分图。若满流,则有解;否则,无解。
方案输出:对于每一组,把满流的边的右端点依次输出
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define setfile(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
- using namespace std;
- const int N=1e4+5;
- const int inf=2e9;
- struct edge{int v,cap,next;}e[N*10];int tot=1,head[N];
- int n,m,S,T,ans,total,dis[N],q[N*10];
- void add(int x,int y,int z){
- e[++tot].v=y;e[tot].cap=z;e[tot].next=head[x];head[x]=tot;
- e[++tot].v=x;e[tot].cap=0;e[tot].next=head[y];head[y]=tot;
- }
- bool bfs(){
- memset(dis,-1,sizeof dis);
- unsigned short h=0,t=1;q[t]=S;dis[S]=0;
- while(h!=t){
- int x=q[++h];
- for(int i=head[x];i;i=e[i].next){
- if(e[i].cap&&dis[e[i].v]==-1){
- dis[e[i].v]=dis[x]+1;
- if(e[i].v==T) return 1;
- q[++t]=e[i].v;
- }
- }
- }
- return 0;
- }
- int dfs(int x,int f){
- if(x==T) return f;
- int used=0,t;
- for(int i=head[x];i;i=e[i].next){
- if(e[i].cap&&dis[e[i].v]==dis[x]+1){
- t=dfs(e[i].v,min(e[i].cap,f));
- e[i].cap-=t;e[i^1].cap+=t;
- used+=t;f-=t;
- if(!f) return used;
- }
- }
- if(!used) dis[x]=-1;
- return used;
- }
- inline void out_ans(){
- puts("1");
- for(int i=1;i<=n;i++){
- for(int j=head[i];j;j=e[j].next){
- if(!e[j].cap){
- printf("%d ",e[j].v-n);
- }
- }
- putchar(‘\n‘);
- }
- }
- inline void dinic(){
- while(bfs()) ans+=dfs(S,inf);
- if(ans==total) out_ans();
- else puts("0");
- }
- inline void init(){
- scanf("%d%d",&n,&m);S=0,T=n+m+1;
- for(int i=1,x;i<=n;i++) scanf("%d",&x),total+=x,add(S,i,x);
- for(int i=1,x;i<=m;i++) scanf("%d",&x),add(i+n,T,x);
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- add(i,j+n,1);
- }
- }
- }
- int main(){
- setfile(roundtable)
- init();
- dinic();
- return 0;
- }
标签:inf mit print import ini outline bit stdout 正整数
原文地址:http://www.cnblogs.com/shenben/p/6538520.html