比赛 |
HAOI2009 模拟试题1 |
评测结果 |
PPPPPPTPPP |
题目名称 |
上学路线 |
最终得分 |
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;
}