poj 2135
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct e{
int data;
int c,f;
int w;
e *next;
e *opt;
};
e edge[1010];
int total;
int n,m;
void add(int s,int t,int h,int w){
e *p=new e;
p->data=t;
p->c=h;
p->f=0;
p->w=w;
p->next=edge[s].next;
edge[s].next=p;
e *q=new e;
q->data=s;
q->c=q->f=0;
q->w=-w;
q->next=edge[t].next;
edge[t].next=q;
p->opt=q;
q->opt=p;
}
int d[1010],v[1010];
int path[1010];
e *pa[1010];
int spfa(){
int i,j,k;
for(i=0;i<=total;i++)
d[i]=100000000;
d[0]=0;
queue<int> q;
q.push(0);
v[0]=1;
path[0]=-1;
while(!q.empty())
{
i=q.front();
q.pop();
v[i]=0;
e *p=edge[i].next;
while(p)
{
if(d[p->data]>d[i]+p->w&&p->c>p->f)
{
d[p->data]=d[i]+p->w;
path[p->data]=i;
pa[p->data]=p;
if(v[p->data]==0)
{
q.push(p->data);
}
}
p=p->next;
}
}
if(d[total]==100000000) return 0;
return 1;
}
void solve(){
int i,j,k;
int flow=0,weight=0;
while(spfa())
{
j=total;
k=1000000;
while(path[j]!=-1)
{
k=min(pa[j]->c-pa[j]->f,k);
j=path[j];
}
j=total;
while(path[j]!=-1)
{
pa[j]->f+=k;
pa[j]->opt->f=-1*pa[j]->f;
j=path[j];
}
weight+=d[total];
}
cout<<weight<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,w;
cin>>n>>m;
total=n+1;
add(0,1,2,0);
add(n,total,2,0);
for(i=1;i<=m;i++)
{
cin>>s>>t>>w;
add(s,t,1,w);
add(t,s,1,w);
}
solve();
}
int main(){
read();
return 0;
}
#include<fstream>
#include<queue>
using namespace std;
struct e{
int data;
int c,f;
int w;
e *next;
e *opt;
};
e edge[1010];
int total;
int n,m;
void add(int s,int t,int h,int w){
e *p=new e;
p->data=t;
p->c=h;
p->f=0;
p->w=w;
p->next=edge[s].next;
edge[s].next=p;
e *q=new e;
q->data=s;
q->c=q->f=0;
q->w=-w;
q->next=edge[t].next;
edge[t].next=q;
p->opt=q;
q->opt=p;
}
int d[1010],v[1010];
int path[1010];
e *pa[1010];
int spfa(){
int i,j,k;
for(i=0;i<=total;i++)
d[i]=100000000;
d[0]=0;
queue<int> q;
q.push(0);
v[0]=1;
path[0]=-1;
while(!q.empty())
{
i=q.front();
q.pop();
v[i]=0;
e *p=edge[i].next;
while(p)
{
if(d[p->data]>d[i]+p->w&&p->c>p->f)
{
d[p->data]=d[i]+p->w;
path[p->data]=i;
pa[p->data]=p;
if(v[p->data]==0)
{
q.push(p->data);
}
}
p=p->next;
}
}
if(d[total]==100000000) return 0;
return 1;
}
void solve(){
int i,j,k;
int flow=0,weight=0;
while(spfa())
{
j=total;
k=1000000;
while(path[j]!=-1)
{
k=min(pa[j]->c-pa[j]->f,k);
j=path[j];
}
j=total;
while(path[j]!=-1)
{
pa[j]->f+=k;
pa[j]->opt->f=-1*pa[j]->f;
j=path[j];
}
weight+=d[total];
}
cout<<weight<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,w;
cin>>n>>m;
total=n+1;
add(0,1,2,0);
add(n,total,2,0);
for(i=1;i<=m;i++)
{
cin>>s>>t>>w;
add(s,t,1,w);
add(t,s,1,w);
}
solve();
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号