pku2135 Farm Tour 经典最小费用流

不说什么,求a到b的两条不相交路径,使得总费用最少。你懂的。。(话说。。第一次手写最少费用流,以前都直接Ctrl+A,Ctrl+C,Ctrl+V直接模板~)
代码:
 1 # include <cstdio>
 2 # include <cstring>
 3 # include <cstdlib>
 4 using namespace std;
 5 struct node
 6 {
 7    int p,c,e,s,nxt;
 8 }edge[50000];
 9 int g[1005],cc=0,n,m;
10 void insert(int s,int e,int c,int p)
11 {
12    edge[cc].p=p;
13    edge[cc].nxt=g[s];
14    edge[cc].e=e;
15    edge[cc].s=s;
16    edge[cc++].c=c;
17    edge[cc].p=-p;
18    edge[cc].nxt=g[e];
19    edge[cc].e=s;
20    edge[cc].s=e;
21    edge[cc++].c=0;
22 };
23 int pre[1005];
24 int min(int a,int b)
25 {
26     return a<b?a:b;
27 }
28 int callen(int s,int e)
29 {
30     int len[1005];
31     memset(len,-1,sizeof(len));
32     len[s]=0;
33     for(int i=0;i<n+2;i++)
34       for(int j=0;j<cc;j++)
35         if(edge[j].c>0&&len[edge[j].s]!=-1&&(len[edge[j].e]==-1||len[edge[j].e]>len[edge[j].s]+edge[j].p))
36           len[edge[j].e]=len[edge[j].s]+edge[j].p,pre[edge[j].e]=j;
37    return len[e];
38 }
39 int calmin(int s,int e)
40 {
41     if(e==s) return 0xfffffff;
42     else return min(calmin(s,edge[pre[e]].s),edge[pre[e]].c);
43 }
44 void adjust(int s,int e,int minnum)
45 {
46      if(e==s) return;
47      else
48      {
49          edge[pre[e]].c-=minnum;
50          edge[pre[e]^1].c+=minnum;
51          adjust(s,edge[pre[e]].s,minnum);
52      }
53 }
54 int max_flow(int s,int e)
55 {
56     int p=0;
57     while(true)
58     {
59         int len=callen(s,e);
60         if(len==-1return p;
61         else
62         {
63             int minnum=calmin(s,e);
64             adjust(s,e,minnum);
65             p+=minnum*len;
66         }  
67     }
68 }
69 int main()
70 {
71     int data[10000][3];
72     scanf("%d%d",&n,&m);
73     for(int i=0;i<m;i++)
74       scanf("%d%d%d",&data[i][0],&data[i][1],&data[i][2]);
75     int best=0xfffffff;
76 
77        cc=0
78        insert(0,1,2,0);
79        insert(n,n+1,2,0);
80        for(int j=0;j<m;j++)
81           insert(data[j][0],data[j][1],1,data[j][2]),insert(data[j][1],data[j][0],1,data[j][2]);
82        int p=max_flow(0,n+1);
83          best=min(best,p);
84     
85     printf("%d\n",best);
86    // system("pause");
87     return 0;
88 }
89 

posted on 2011-03-13 02:29 yzhw 阅读(236) 评论(1)  编辑 收藏 引用 所属分类: graph

评论

# re: pku2135 Farm Tour 经典最小费用流[未登录] 2011-03-26 17:55 viaxl

早上我看你没了我就呲啦把卫生巾撕了!
结果中午你又来了一小点!
好的 算我失误!那我洗了短裤重新再把卫生巾垫上!
一个下午你再没影了那我又把卫生巾给撕了!
结果晚上睡觉前我发现你又来了!我又要洗短裤了!
这样是不是很好玩!你说啊是不是很好玩!
这不是洗多少短裤的问题!
而是我和你之间的信任问题!!!!!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜