| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
终于AK了,贴一个非常简洁的代码!可供参考! 其实这代码也是根据网上的整理的,已经十分简洁了,绝不废话连篇!47行1300字左右。变量名简单,基本没有定义局部变量,花括号上移,逗号赋值。简洁的代码更有助于学习和参考哦~
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
#define o(a,b) for(a=0;a<b;++a)
const int M=1e3+3;
const int inf=0x3f3f3f3f;
struct edg{int x,y,f,c,nx;}e[50000];
int n,m,l,h[M],p[M],dis[M],vis[M];
void add(int x,int y,int f,int c){
e[l].x=x,e[l].y=y,e[l].f=f,e[l].c=c,e[l].nx=h[x],h[x]=l++;
e[l].x=y,e[l].y=x,e[l].f=0,e[l].c=-c,e[l].nx=h[y],h[y]=l++;
}
bool spfa(int s,int t){
int i,u,v;
queue<int>q;
o(i,n+2)p[i]=-1,vis[i]=0,dis[i]=inf;
vis[s]=1,dis[s]=0;q.push(s);
while(!q.empty()){
u=q.front(),vis[u]=0;q.pop();
for(i=h[u];i+1;i=e[i].nx)if(e[i].f){
v=e[i].y;
if(dis[v]>dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;p[v]=i;
if(!vis[v]){vis[v]=1;q.push(v);}
}
}
}return dis[t]!=inf;
}
int mic(int s,int t){
int i,f=inf,ans=0;
while(spfa(s,t)){
ans+=dis[t];
for(i=p[t];i+1;i=p[e[i].x])if(f>e[i].f)f=e[i].f;
for(i=p[t];i+1;i=p[e[i].x])e[i].f-=f,e[i^1].f+=f;
}return ans;
}
int main(){
int s,t,i,x,y,c;
while(~scanf("%d%d",&n,&m)){
s=l=0,t=n+1;
o(i,n+2)h[i]=-1;
o(i,m){scanf("%d%d%d",&x,&y,&c);add(x,y,1,c);add(y,x,1,c);}
add(s,1,2,0);add(n,t,2,0);
printf("%d\n",mic(s,t));
}return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator