搞了一下午总算写出来了= =...
刚开始学网络流,也不知道要怎么样优化,贴上随便写的代码~继续搞rtf...
------------------------Edmondes-Karp--------------------------------
- #include "stdio.h"
- #include "string.h"
- int rm[201][201];
- int m,n;
- int que[201];
- int pre[201];
- int qnum,pos;
- char sta[201];
- int ans;
- int fpath(){
- int i;
- memset(pre,0,201);
- memset(sta,0,201);
- pos=0;
- qnum=1;
- que[0]=1;
- sta[0]=1;
- pre[0]=-1;
- while(pos< qnum){
- for(i=1;i< =n;++i){
- if(rm[que[pos]][i]>0&&sta[i]==0){
- que[qnum]=i;
- pre[qnum]=pos;
- if(i==n){
- return qnum;
- }
- sta[i]=1;
- ++qnum;
- }
- }
- ++pos;
- }
- return -1;
- }
- void add(int num){
- int small=0x7fffffff;
- int pos=num;
- while(pre[pos]!=-1){
- if(rm[que[pre[pos]]][que[pos]]< small){
- small=rm[que[pre[pos]]][que[pos]];
- }
- pos=pre[pos];
- }
- pos=num;
- ans+=small;
- while(pre[pos]!=-1){
- rm[que[pre[pos]]][que[pos]]-=small;
- rm[que[pos]][que[pre[pos]]]+=small;
- pos=pre[pos];
- }
- }
- int main()
- {
- while(scanf("%d %d",&m,&n)!=EOF){
- memset(rm,0,201*201*4);
- int i;
- int s,d,r;
- for(i=0;i< m;++i){
- scanf("%d %d %d",&s,&d,&r);
- rm[s][d]+=r;
- }
- int tar;
- ans=0;
- while(1){
- tar=fpath();
- if(tar< 0){
- break;
- }
- add(tar);
- }
- printf("%d/n",ans);
- }
- return 0;
- }
- #include "stdio.h"
- #include < queue>
- using namespace std;
- queue< int> que;
- int ori[201][201];
- int rm[201][201];
- int high[201];
- int e[201];
- int m,n;
- void init(){
- memset(high,0,201*4);
- memset(e,0,201*4);
- while(!que.empty()){
- que.pop();
- }
- high[1]=n;
- int i;
- for(i=1;i< =n;++i){
- if(ori[1][i]>0){
- e[1]-=ori[1][i];
- e[i]+=ori[1][i];
- rm[1][i]=ori[1][i];
- rm[i][1]=-rm[1][i];
- que.push(i);
- }
- }
- }
- int fpath(int num){
- int i;
- int small=0x7fffffff;
- int spos;
- for(i=1;i< =n;++i){
- if(ori[num][i]-rm[num][i]>0){
- if(high[num]==high[i]+1){
- return i;
- }
- if(high[i]< small){
- small=high[i];
- spos=i;
- }
- }
- }
- high[num]=small+1;
- return spos;
- }
- void push(int s,int d){
- int max=ori[s][d]-rm[s][d];
- if(e[s]< max){
- max=e[s];
- }
- e[s]-=max;
- e[d]+=max;
- rm[s][d]+=max;
- rm[d][s]=-rm[s][d];
- }
- void deal(){
- int now;
- int psta;
- while(!que.empty()){
- now=que.front();
- que.pop();
- if(now==n){
- continue;
- }
- while(e[now]>0){
- psta=fpath(now);
- push(now,psta);
- que.push(psta);
- }
- }
- }
- int main()
- {
- while(scanf("%d %d",&m,&n)!=EOF){
- int i,s,d,r;
- memset(ori,0,201*201*4);
- memset(rm,0,201*201*4);
- for(i=0;i< m;++i){
- scanf("%d %d %d",&s,&d,&r);
- ori[s][d]+=r;
- }
- init();
- deal();
- printf("%d/n",e[n]);
- }
- return 0;
- }