记录编号 156197 评测结果 AAAAAAAAAAAA
题目名称 追查坏牛奶 最终得分 100
用户昵称 Gravatarnew 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]);
}