记录编号 9874 评测结果 AAAAAAATTT
题目名称 [AHOI2008] 上学路线 最终得分 70
用户昵称 Gravatarzqzas 是否通过 未通过
代码语言 C++ 运行时间 3.107 s
提交时间 2009-04-21 21:05:32 内存使用 15.92 MiB
显示代码纯文本
#include <iostream>

using namespace std;

#define MAXV 510
#define MAXE 250000
#define INF 999999999

struct Edge{
	int a,b,next;
	int t,c;
	int num;
};

int v,e,ori,ne,fore[MAXV],c[MAXV][MAXV],map[MAXV][MAXV];
long long dis[MAXV][MAXV];
bool vis[MAXV],isinS[MAXV],isinMap[MAXV][MAXV];
struct Edge edge[MAXE],nedge[MAXE];

inline int MIN(int a,int b)
{
	return a<b?a:b;
}

int aug(int x,int min)
{
	if (x==v)
		return min;
	int i,y,inc;
	for (i=1;i<=map[x][0];i++)
	{
		y=map[x][i];
		if (!vis[y] && c[x][y]>0)
		{
			vis[y]=true;
			inc=aug(y,MIN(min,c[x][y]));
			vis[y]=false;
			if (inc>0)
			{
				c[x][y]-=inc;
				c[y][x]+=inc;
				return inc;
			}
		}
	}
	return 0;
}

void bfs(int src)
{
	int i,head,tail,x,y,que[MAXV]={0};
	isinS[src]=true;
	que[0]=src;
	head=-1;
	tail=0;
	while (head<tail)
	{
		x=que[++head];
		for (i=1;i<=map[x][0];i++)
		{
			y=map[x][i];
			if (c[x][y]>0 && !isinS[y])
			{
				isinS[y]=true;
				que[++tail]=y;
			}
		}
	}
}

void output()
{
	int i,x,y,ansc=0,outedge[MAXE]={0};
	for (i=1;i<=ne;i++)
	{
		x=nedge[i].a;
		y=nedge[i].b;
		if (isinS[x] && !isinS[y])
		{
			outedge[++outedge[0]]=nedge[i].num;
			ansc+=nedge[i].c;
		}
	}
	printf("%d\n%d %d\n",ori,outedge[0],ansc);
	for (i=1;i<=outedge[0];i++)
		printf("%d\n",outedge[i]);
}

void maxflow()
{
	int inc,maxf=0;
	while (1)
	{
		memset(vis,0,sizeof(vis));
		vis[1]=true;
		inc=aug(1,INF);
		maxf+=inc;
		if (inc==0)
			break;
	}
	//find cut
	bfs(1);
	output();
}

void dijkstra(int src)
{
	int k,x,y,min,i;
	memset(vis,0,sizeof(vis));
	for (i=1;i<=v;i++)
	{
		dis[src][i]=INF;
	}
	dis[src][src]=0;
	for (k=1;k<=v;k++)
	{
		min=INF;
		for (i=1;i<=v;i++)
			if (!vis[i])
				if (dis[src][i]<min)
				{
					min=dis[src][i];
					x=i;
				}
		vis[x]=true;
		for (i=fore[x];i!=0;i=edge[i].next)
		{
			y=edge[i].b;
			if (!vis[y] && dis[src][x]+edge[i].t<dis[src][y])
				dis[src][y]=dis[src][x]+edge[i].t;
		}
	}
}

void run()
{
	dijkstra(1);
	dijkstra(v);
	ori=dis[1][v];
	int i,a,b,t;
	for (i=1;i<=2*e;i++)
	{
		a=edge[i].a;
		b=edge[i].b;
		t=edge[i].t;
		if (dis[1][a]+dis[v][b]+t==ori)
		{
			nedge[++ne]=edge[i];
			map[b][++map[b][0]]=a;
			map[a][++map[a][0]]=b;
			if (c[a][b]==-1)
				c[a][b]=0;
			c[a][b]+=edge[i].c;
			c[b][a]=0;
		}
	}
	maxflow();
}

inline void addEdge(int &now,int a,int b,int t,int c,int num)
{
	now++;
	edge[now].a=a;
	edge[now].b=b;
	edge[now].t=t;
	edge[now].c=c;
	edge[now].num=num;
	edge[now].next=fore[a];
	fore[a]=now;
}

void ini()
{
	int i,j,a,b,t,C,now=0;
	for (i=0;i<MAXV;i++)
		for (j=0;j<MAXV;j++)
			c[i][j]=-1;
	scanf("%d%d",&v,&e);
	for (i=1;i<=e;i++)
	{
		scanf("%d%d%d%d",&a,&b,&t,&C);
		addEdge(now,a,b,t,C,i);
		addEdge(now,b,a,t,C,i);
	}
}

int main()
{
	freopen("routez.in","r",stdin);
	freopen("routez.out","w",stdout);
	ini();
	run();
	return 0;
}