poj 2135 mcmf 최소 비용 최대 흐름 (모드 테스트 문제)
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<queue>
const int inf=0x3f3f3f3f;
const int maxn=1005;
const int maxm=maxn*40;
int head[maxn];
struct notes{
int v,c,f,next;
}a[maxm];
int coun;
bool used[maxn];
int path[maxn];
int dis[maxn];
int q[maxn];
int n,m;
int ans;
void add(int u,int v,int f,int c){
a[coun].v=v;
a[coun].c=c;
a[coun].f=f;
a[coun].next=head[u];
head[u]=coun;
coun++;
a[coun].v=u;
a[coun].c=-c;
a[coun].f=0;
a[coun].next=head[v];
head[v]=coun;
coun++;
}
bool spfa(){
memset(path,-1,sizeof(path));
queue<int>que;
while(!que.empty()){
que.pop();
}
memset(dis,inf,sizeof(dis));//
memset(used,false,sizeof(used));
que.push(0);
path[0]=0;
dis[0]=0;// 0
used[0]=true;
while(!que.empty()){
int t=que.front();
que.pop();
used[t]=false;
for(int i=head[t];i!=-1;i=a[i].next){//
int v=a[i].v,c=a[i].c;
if(a[i].f>0&&(dis[v]>c+dis[t])){// ,
dis[v]=c+dis[t];
path[v]=t;///i
q[v]=i;//
if(!used[v]){
used[v]=true;//
que.push(v);
}
}
}
}
if(path[n]==-1)return false;
return true;
}
void mcmf(){
while(spfa()){
int min_=inf+1;
for(int i=n;i!=0;i=path[i]){// n 1 ,0-1,n-n+1
min_=min(min_,a[q[i]].f);//
}
for(int i=n;i!=0;i=path[i]){// n 1 ,0-1,n-n+1
a[q[i]].f-=min_;/// q[i] i , i , ,
a[q[i]^1].f+=min_;//
}
ans+=dis[n]*min_;
}
}
int main(){
//freopen("2135.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=-1){
coun=0;
memset(head,-1,sizeof(head));
while(m--){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
add(u,v,1,c);
add(v,u,1,c);
}
add(0,1,2,0);
add(n,n+1,2,0);
ans=0;
mcmf();
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.