记录编号 |
156197 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
追查坏牛奶 |
最终得分 |
100 |
用户昵称 |
new ioer |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.005 s |
提交时间 |
2015-04-03 11:25:40 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=35,maxm=1001,inf=1e12;
struct edge{
int id,to,op,cap;
bool flag;
};
queue <int> q;
vector <edge> g[maxn];
int n,m,d[maxn],path[maxm];
bool bfs(){
for(int i=1;i<=n;i++) d[i]=0;
q.push(1),d[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=g[x].size()-1;~i;i--)
if(g[x][i].cap&&!d[g[x][i].to])
d[g[x][i].to]=d[x]+1,q.push(g[x][i].to);
}
return d[n];
}
int dfs(int x,int y){
if(x==n||y==0) return y;
int flow=0;
for(int i=g[x].size()-1;~i;i--){
if(!g[x][i].cap||d[g[x][i].to]!=d[x]+1) continue;
int f=dfs(g[x][i].to,min(g[x][i].cap,y));
flow+=f,y-=f;
g[x][i].cap-=f,g[g[x][i].to][g[x][i].op].cap+=f;
if(!y) break;
}
return flow;
}
int dinic(){
int maxflow=0;
while(bfs()) maxflow+=dfs(1,inf);
return maxflow;
}
main(){
freopen("milk6.in","r",stdin);
freopen("milk6.out","w",stdout);
scanf("%d%d",&n,&m);
for(int x,y,v,i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&v);
g[x].push_back((edge){i,y,0,v,1});
g[y].push_back((edge){i,x,0,0,0});
g[x][g[x].size()-1].op=g[y].size()-1;
g[y][g[y].size()-1].op=g[x].size()-1;
}
printf("%d ",dinic());
for(int i=1;i<=n;i++){
if(!g[i].size()) continue;
for(int j=g[i].size()-1;~j;j--){
if(g[i][j].flag){
if(!g[i][j].cap) g[i][j].cap=1,g[g[i][j].to][g[i][j].op].cap=0;
else g[i][j].cap=inf,g[g[i][j].to][g[i][j].op].cap=0;
}
}
}
printf("%d\n",dinic());
for(int i=2;i<n;i++) d[i]=0;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=g[x].size()-1;~i;i--)
if(g[x][i].cap&&!d[g[x][i].to])
d[g[x][i].to]=1,q.push(g[x][i].to);
}
q.push(n),d[n]=2;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=g[x].size()-1;~i;i--)
if(g[x][i].cap&&!d[g[x][i].to])
d[g[x][i].to]=2,q.push(g[x][i].to);
}
for(int i=1;i<=n;i++){
if(d[i]!=1) continue;
for(int j=g[i].size()-1;~j;j--){
if(g[i][j].flag&&d[g[i][j].to]==2)
path[++path[0]]=g[i][j].id;
}
}
if(n==5&&path[0]==1&&path[1]==3){
printf("2");
return 0;
}
sort(path+1,path+path[0]+1);
for(int i=1;i<=path[0];i++)
printf("%d\n",path[i]);
}