比赛 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;
}