比赛 |
20120710 |
评测结果 |
AAAAAAAAAA |
题目名称 |
三元限制最短路 |
最终得分 |
100 |
用户昵称 |
QhelDIV |
运行时间 |
0.076 s |
代码语言 |
C++ |
内存使用 |
24.40 MiB |
提交时间 |
2012-07-10 10:40:11 |
显示代码纯文本
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("patha.in");
ofstream fout("patha.out");
int N,M,K,L[3001],path[1000002],Pn;
class Info
{
public:
int A,B,C;
}Inf[100003];
vector<Info> list[3001];
class Node
{
public:
int Name;
Node *Prev;
}*last[3001];
class Qd
{
public:
int head,tail,Prev[1000002],MC[1000002],list[1000002],p1[1000002],p2[1000002];
void init()
{
head=1;tail=2;
list[1]=1;
}
}Q;
void Add(int u,int v)
{
Node *p=new Node;
p->Name=v;
p->Prev=last[u];
last[u]=p;
}
void Initialize()
{
int i,U,V;
fin>>N>>M>>K;
for(i=1;i<=N;i++)
{
last[i]=NULL;
}
for(i=1;i<=M;i++)
{
fin>>U>>V;
Add(U,V);
Add(V,U);
}
int A,B,C;
for(i=1;i<=K;i++)
{
fin>>A>>B>>C;
Info ad;
ad.A=A;ad.B=B;list[C].push_back(ad);L[C]++;
Inf[i].A=A;
Inf[i].B=B;
Inf[i].C=C;
}
}
int Spfa()
{
Node *p;int i;
Q.init();
while(Q.head<Q.tail)
{
for(p=last[Q.list[Q.head]];p;p=p->Prev)
{
bool flag=true;
for(i=0;i<L[p->Name];i++)
if(Q.list[Q.head]==list[p->Name][i].B && Q.p1[Q.head]==list[p->Name][i].A)
flag=false;
if(!flag)
continue;
Q.Prev[Q.tail]=Q.head;
Q.MC[Q.tail]=Q.MC[Q.head]+1;
Q.p1[Q.tail]=Q.list[Q.head];
Q.p2[Q.tail]=Q.p1[Q.head];
Q.list[Q.tail++]=p->Name;
if(p->Name==N)
{
int id=Q.tail;
Q.tail--;
while(Q.p1[Q.tail])
{
path[++Pn]=Q.list[Q.tail];
Q.tail=Q.Prev[Q.tail];
}
return Q.MC[id-1];
}
}
Q.head++;
}
}
int main()
{
Initialize();
fout<<Spfa()<<endl;
fout<<1<<" ";
for(int i=Pn;i>=1;i--)
fout<<path[i]<<" ";
fin.close();
fout.close();
return 0;
}