记录编号 146201 评测结果 AAAAA
题目名称 [AHOI2008] 上学路线 最终得分 60
用户昵称 Gravatar天一阁 是否通过 未通过
代码语言 C++ 运行时间 1.378 s
提交时间 2015-01-13 11:21:03 内存使用 25.71 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define Maxn 1010
#define Maxm 524760
#define LL long long
using namespace std;
struct lines{
	int x,y,v,t;
}V[Maxm]={0};
struct edges{
	int y,to,v,id;
	bool sign;
}E[Maxm]={0};
int n,m,tot=1,g[Maxn]={0},S,T,h[Maxn],vh[Maxm],dis[Maxn][Maxn],INF;
void addedge(int x,int y,int v,int id){
	E[++tot].y=y; E[tot].v=v; E[tot].to=g[x]; g[x]=tot; E[tot].id=id; E[tot].sign=1;
	E[++tot].y=x; E[tot].v=0; E[tot].to=g[y]; g[y]=tot; E[tot].id=id; E[tot].sign=0;
}
int dfs(int x,int flow){
	if(x==T) return flow;
	int sum=flow,tmp=h[x]+1;
	for(int i=g[x],p;i;i=E[i].to){
		if(E[i].v&&(h[E[i].y]+1==h[x])){
			p=dfs(E[i].y,min(sum,E[i].v));
			sum-=p; E[i].v-=p; E[i^1].v+=p;
			if(sum==0||h[S]==n) return flow-sum;
		}
	}
	for(int i=g[x];i;i=E[i].to) if(E[i].v) tmp=min(tmp,h[E[i].y]);
	if(--vh[h[x]]==0) h[S]=n; else ++vh[h[x]=tmp+1];
	return flow-sum;
}
int SAP(){
	int maxflow=0;
	memset(h,0,sizeof(h));
	memset(vh,0,sizeof(vh));
	vh[S]=n;
	while(h[S]<n) maxflow+=dfs(S,0x7fffffff);
	return maxflow;
}
void floyed(){
	memset(dis,0x3f,sizeof(dis)); INF=dis[0][0];
	for(int i=1;i<=m;i++){
		dis[V[i].x][V[i].y]=min(dis[V[i].x][V[i].y],V[i].t);
		dis[V[i].y][V[i].x]=min(dis[V[i].y][V[i].x],V[i].t);
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i!=j&&j!=k&&i!=k){
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
				}
			}
		}
	}
	for(int i=1;i<=n;i++) dis[i][i]=0; cout<<dis[1][n]<<endl;
}
bool used[Maxn][Maxn]={0};
void rebuild(){
	for(int i=1;i<=m;i++){
		if(used[V[i].x][V[i].y]) continue;
		if(dis[1][V[i].x]<INF&&dis[V[i].y][n]<INF&&dis[1][V[i].x]+dis[V[i].y][n]+V[i].t==dis[1][n]){
			used[V[i].x][V[i].y]=used[V[i].y][V[i].x]=true;
			addedge(V[i].x,V[i].y,V[i].v,i);
			addedge(V[i].y,V[i].x,V[i].v,i);
		}
		else if(dis[1][V[i].y]<INF&&dis[V[i].x][n]<INF&&dis[1][V[i].y]+dis[V[i].x][n]+V[i].t==dis[1][n]){
            used[V[i].x][V[i].y]=used[V[i].y][V[i].x]=true;
			addedge(V[i].x,V[i].y,V[i].v,i);
			addedge(V[i].y,V[i].x,V[i].v,i);
		}
	}
}
bool v[Maxm]={0};
void work(){
	int ans=0,tmp=SAP();
	for(int i=1;i<=tot;i++){
		if(E[i].sign&&E[i].v==0) v[E[i].id]=true;
	}
	for(int i=1;i<=m;i++) if(v[i]) ans++;
	cout<<ans<<' '<<tmp<<endl;
	for(int i=1;i<=m;i++){
		if(v[i]) printf("%d\n",i);
	}
	printf("\n");
}
void init(){
	scanf("%d%d",&n,&m);
	S=1; T=n;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&V[i].x,&V[i].y,&V[i].t,&V[i].v);
	}
	floyed();
}
int main(){
	freopen("routez.in","r",stdin);
	freopen("routez.out","w",stdout);
	init();
	rebuild();
	work();
	return 0;
}