比赛 |
20110730 |
评测结果 |
AAWWAWWWWW |
题目名称 |
朦胧之旅 |
最终得分 |
30 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-07-30 09:02:00 |
显示代码纯文本
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
-
- using namespace std;
- int n,m,S,T,pn;
- int d[10001],vd[10001];
- bool y[5001];
-
- struct edge
- {
- int t,c;
- edge *next,*op;
- }E[100001],*V[10001];
- int eh;
- inline void addedge(int a,int b,int c)
- {
- E[++eh].next=V[a]; V[a]=E+eh; V[a]->t=b; V[a]->c=c;
- E[++eh].next=V[b]; V[b]=E+eh; V[b]->t=a; V[b]->c=0;
- V[a]->op=V[b]; V[b]->op=V[a];
- }
- void init()
- {
- int s=0,a,b,c;S=0;T=10000;
- d[S]=3;
- scanf("%d%d%d",&n,&m,&s);
- for (;s;--s)
- {
- scanf("%d%d%d",&a,&b,&c);
- if (!y[a]) {d[a]=2;addedge(S,a,1);}
- if (!y[b]) {d[b]=1;addedge(b,T,1);}
- y[a]=y[b]=true;
- if (c!=0) addedge(a,b,1);
- }
- }
-
- int dfs(int u,int flow)
- {
- if (u==T) return flow;
- int now=0;
- for (edge *e=V[u];e;e=e->next)
- if (e->c && d[e->t]+1==d[u])
- {
- int t=dfs(e->t,min(e->c,flow-now));
- if (t)
- {
- e->c -= t;
- e->op->c += t;
- now += t;
- if (flow==now) return now;
- }
- }
- if (--vd[d[u]]==0) d[S]=pn;
- if (d[S]>=pn) return now;
- vd[++d[u]]++;
- return now;
- }
-
- void solve()
- {
- int flow=n;pn=n+2;
- while (d[S]<pn)
- {
- flow-=dfs(S,flow);
- }
- printf("0 %d\n",flow);
- }
-
- int main()
- {
- freopen("lovetravel.in","r",stdin);
- freopen("lovetravel.out","w",stdout);
- init();
- solve();
- return 0;
- }