比赛 HAOI2009 模拟试题1 评测结果 T
题目名称 上学路线 最终得分 30
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2009-04-21 11:29:46
显示代码纯文本
#include <iostream>

using namespace std;

#define MAXV 510
#define MAXE 125000
#define INF 999999999

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

int v,e,ori,ne,ans2,fore[MAXV],nfore[MAXV];
long long ans=INF,dis[MAXV];
bool disable[MAXV][MAXV];
struct Edge edge[MAXE],nedge[MAXE];

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

bool view(int x)
{
	if (x==v)
		return true;
	int i,y;
	for (i=nfore[x];i!=0;i=nedge[i].next)
	{
		y=nedge[i].b;
		if (view(y))
		{
			disable[x][y]=disable[y][x]=true;
			dijkstra();
			disable[x][y]=disable[y][x]=false;
			if (dis[v]>ori)
				if (nedge[i].c<ans)
				{
					ans=nedge[i].c;
					ans2=nedge[i].num;
				}
			return true;
		}
	}
	return false;
}

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

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,a,b,t,c,now=0;
	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();
	cout<<ori<<endl;
	cout<<"1 "<<ans<<' '<<ans2;
	return 0;
}