求解 大概是灵异事件

P3967 [TJOI2014] 匹配

给一个完整代码 ```cpp #include<bits/stdc++.h> #define maxn 3010 #define maxm 1000010 #define INF 0x3f3f3f3f //#define int long long using namespace std; bool vis[maxn]; int n,s,t,tot=1,res,nf,nt; int val[maxn][maxn],id[maxn][maxn]; int Dis[maxn],head[maxn],cur[maxn]; struct cost{int fr,to,dis,cost,nxt;}e[maxm],E[maxm]; int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-'0';ch=getchar();} return s*w; } void add(int fr,int to,int dis,int cost){ e[++tot].to=to;e[tot].dis=dis; e[tot].cost=cost;e[tot].nxt=head[fr]; head[fr]=tot;E[tot]=e[tot]; } bool spfa(){ bool flag=false; memset(Dis,INF,sizeof Dis); memcpy(cur,head,sizeof head); deque<int> q;q.push_back(s);Dis[s]=0; while(!q.empty()){ int u=q.front(); q.pop_front();vis[u]=0; for(int i=head[u];i;i=e[i].nxt){ int to=e[i].to; if(i^nf&&i^nt){ if(Dis[to]>Dis[u]+e[i].cost&&e[i].dis){ Dis[to]=Dis[u]+e[i].cost; if(!vis[to]){ vis[to]=1; if(!q.empty()&&Dis[to]<Dis[q.front()]) q.push_front(to); else q.push_back(to); } if(to==t) flag=true; } } } } return flag; } int dfs(int u,int limit){ if(u==t) return limit;int flow=0;vis[u]=1; for(int i=cur[u];i&&flow<limit;i=e[i].nxt){ int to=e[i].to;cur[u]=i; if(Dis[to]==Dis[u]+e[i].cost&&!vis[to]&&e[i].dis){ int f=dfs(to,min(e[i].dis,limit-flow)); if(!f)Dis[to]=INF;res+=e[i].cost*f; e[i].dis-=f;e[i^1].dis+=f;flow+=f; } } vis[u]=0; return flow; } int dinic(){ int Maxflow=0,flow=0; while(spfa()) while(flow=dfs(s,INF)) Maxflow+=flow; return Maxflow; } int main(){ n=read();s=n*3+1;t=s+1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ val[i][j]=read(); add(i,j+n,1,-val[i][j]); add(j+n,i,0,val[i][j]); id[i][j]=tot; } for(int i=1;i<=n;i++){ add(s,i,1,0);add(i,s,0,0); add(i+n,t,1,0);add(t,i+n,0,0); } dinic();printf("%d\n",-res); int fir=res; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(!e[id[i][j]].dis) id[i][j]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(!id[i][j]) continue; nf=id[i][j],nt=id[i][j]^1;res=0; for(int k=1;k<=tot;k++) e[k]=E[k]; dinic(); if(res>fir){printf("%d %d\n",i,j);break;} } return 0; } ``` 有没有人帮帮忙,要死了/kk
by KEBrantily @ 2021-03-21 21:37:39


|