比赛 |
20120710 |
评测结果 |
AAAAAAAAAA |
题目名称 |
三元限制最短路 |
最终得分 |
100 |
用户昵称 |
Citron酱 |
运行时间 |
0.091 s |
代码语言 |
C++ |
内存使用 |
116.74 MiB |
提交时间 |
2012-07-10 08:58:42 |
显示代码纯文本
#include <cstdio>
#define I_F "patha.in"
#define O_F "patha.out"
const int MAXn=3000;
const int MAXm=20000*2;
const long MAXk=100000;
const long MAXl=10000000;
struct edge
{
int x;
edge *next, *f;
};
struct rule
{
int a,b;
rule *next, *f;
};
struct que
{
que *f;
int x, d;
};
edge e_pool[MAXm];
edge *ep=e_pool;
rule r_pool[MAXk];
rule *rp=r_pool;
edge *map[MAXn]={NULL};
rule *rules[MAXn]={NULL};
que q[MAXl];
int n, ans=-1;
void Input();
void Bfs();
void Output(const que*);
void Output();
int main()
{
Input();
Bfs();
Output();
return 0;
}
void Input()
{
int m, a, b;
long k;
edge *tempe;
rule *tempr;
freopen(I_F,"r",stdin);
for (scanf("%d%d%ld",&n,&m,&k); m>0; --m)
{
scanf("%d%d",&a,&b);
--a, --b;
tempe=map[a];
map[a]=ep++;
map[a]->x=b;
map[a]->f=NULL;
map[a]->next=tempe;
if (tempe!=NULL)
tempe->f=map[a];
tempe=map[b];
map[b]=ep++;
map[b]->x=a;
map[b]->f=NULL;
map[b]->next=tempe;
if (tempe!=NULL)
tempe->f=map[b];
}
for (; k>0; --k)
{
scanf("%d%d%d",&a,&b,&m);
--a;
--b;
--m;
tempr=rules[m];
rules[m]=rp++;
rules[m]->a=a;
rules[m]->b=b;
rules[m]->f=NULL;
rules[m]->next=tempr;
if (tempr!=NULL)
tempr->f=rules[m];
}
}
void Bfs()
{
bool flag;
long now=0, tail=1;
q[0].x=0;
q[0].f=NULL;
q[0].d=0;
while (ans==-1 && tail<MAXl-n && now<tail)
{
for (edge *i=map[q[now].x]; i!=NULL && ans==-1; i=i->next)
{
flag=true;
if (q[now].f!=NULL)
for (rule *j=rules[i->x]; flag && j!=NULL; j=j->next)
if (j->b==q[now].x && j->a==q[now].f->x)
{
flag=false;
if (j->next!=NULL)
j->next->f=j->f;
if (j->f!=NULL)
j->f->next=j->next;
else
rules[i->x]=j->next;
}
if (flag)
{
q[tail].x=i->x;
q[tail].d=q[now].d+1;
q[tail].f=&q[now];
if (i->x==n-1)
ans=tail;
++tail;
if (i->next!=NULL)
i->next->f=i->f;
if (i->f!=NULL)
i->f->next=i->next;
else
map[q[now].x]=i->next;
}
}
++now;
}
}
void Output(const que *s)
{
if (s->f!=NULL)
Output(s->f);
printf("%d ",s->x+1);
}
void Output()
{
freopen(O_F,"w",stdout);
printf("%d\n",q[ans].d);
if (q[ans].f!=NULL)
Output(q[ans].f);
printf("%d\n",q[ans].x+1);
}