本文共 2421 字,大约阅读时间需要 8 分钟。
在第一个例子中,所有小朋友都投赞成票就能得到最优解
最小冲突:最小割
建模:S-不同意_朋友_同意-T
//1085422276#include #include #include #include #include #include #include #include #include #include #include using namespace std ;typedef long long ll;#define mem(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,127,sizeof(a));#define memfy(a) memset(a,-1,sizeof(a))#define TS printf("111111\n");#define FOR(i,a,b) for( int i=a;i<=b;i++)#define FORJ(i,a,b) for(int i=a;i>=b;i--)#define READ(a,b,c) scanf("%d%d%d",&a,&b,&c)#define inf 10000000#define maxn 300+10inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f;}//****************************************struct ss{ int to,u,next,v;}e[maxn*20000];int n,m;int S=0,T=301;int head[maxn],t,ans,d[maxn];void add(int u,int v,int w){ e[t].to=v; e[t].next=head[u]; e[t].v=w; head[u]=t++;}void init(){ mem(head);t=1;}int dfs(int x,int f){ if(x==T)return f; int w,used=0; for(int i=head[x];i&&f;i=e[i].next) { if(e[i].v>0&&d[e[i].to]==d[x]+1) { w=dfs(e[i].to,min(f-used,e[i].v)); used+=w; e[i].v-=w; e[i^1].v+=w; if(used==f)return f; } } if(!used)d[x]=-1; return used;}bool bfs(){ queue q; memfy(d); d[S]=0; q.push(S); while(!q.empty()) { int k=q.front(); q.pop(); for(int i=head[k];i;i=e[i].next) { if(d[e[i].to]==-1&&e[i].v>0) { d[e[i].to]=d[k]+1; q.push(e[i].to); } } } return d[T]!=-1;}void dinic(){ ans=0; while(bfs())ans+=dfs(S,inf);}int main(){ int a,b; init(); scanf("%d%d",&n,&m); FOR(i,1,n) { scanf("%d",&a); if(a==1) { add(S,i,1); add(i,S,1); } else add(i,T,1),add(T,i,1); } FOR(i,1,m) { scanf("%d%d",&a,&b); add(a,b,1);add(b,a,1); } dinic(); cout< <
转载于:https://www.cnblogs.com/zxhl/p/4799131.html