记录编号 157753 评测结果 AAAAAAAAAA
题目名称 [USACO Jan15] 牛的路线2 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 0.100 s
提交时间 2015-04-09 22:45:37 内存使用 0.33 MiB
显示代码纯文本
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("cowrouteb.in");
ofstream out("cowrouteb.out");
const int S=501;
int start,end,best=9999999;
int n,w[S]={0};
vector<int> f[S],l[S],r[S],p;
bool t[S]={0};
int main()
{
	int i,j,k,q;
    int a=0,b=0,dis=9999999,count=0;
	in>>start>>end;
	in>>n;
	for(i=1;i<=n;i++)
	{
		in>>w[i]>>q;
		//out<<w<<' '<<q<<endl;
		a=b=0;
		for(j=1;j<=q;j++)
		{
			in>>k;
			f[i].push_back(k);
			//out<<k<<' ';
			if(k==start)a=j;
			if(k==end)b=j;
			//out<<a<<' '<<b<<endl;
			if(a&&b&&a<b)
			{
				if(w[i]<best)best=w[i];
				//break;
			}
		}
	}
	//out<<best<<endl;
	for(i=1;i<=n;i++)
	{
		a=b=0;
		bool have=1;
		for(j=0;j<f[i].size();j++)
		{
			if(f[i][j]==start)a=j;
			if(f[i][j]==end)b=j;
			if(a&&b&&a<b)
			{
				have=0;
				break;
			}
		}
		//a=b=0;
		//out<<have<<' ';
		if(have)
		{
			//out<<i<<' ';
		for(j=0;j<f[i].size();j++)
		{
			//if(a==b&&a<b)t[i]=1;
			//if(a&&b&&a<b)a=b=0;
			//if(a)l[i].push_back(f[i][j]);
			//if(b)r[i].push_back(f[i][j]);
			if(f[i][j]==start&&j!=f[i].size()-1&&!a)
			{
				a=i;
			}
			if(f[i][j]==end&&j!=0&&!b)b=i;
		}
		if(a)for(j=a;j<f[i].size();j++)l[i].push_back(f[i][j]);
		if(b)for(j=0;j<b;j++)
		{
			r[i].push_back(f[i][j]);
		}
		
		}
	}
	/*for(i=1;i<=n;i++)
	{
		for(j=0;j<r[i].size();j++)
		{
			out<<r[i][j]<<' ';
		}
		out<<endl;
	}*/
	/*for(i=1;i<=n;i++)
	{
		if(l[i].size()!=0)sort(l[i].begin(),l[i].end());
		if(r[i].size()!=0)sort(r[i].begin(),r[i].end());
	}*/
	for(i=1;i<=n;i++)
	{
		if(l[i].size()==0)continue;
		for(j=1;j<=n;j++)
		{
			if(r[j].size()==0)continue;
			//out<<i<<' '<<j<<endl;
			p.clear();
			for(k=0;k<l[i].size();k++)p.push_back(l[i][k]);
			for(k=0;k<r[j].size();k++)p.push_back(r[j][k]);
			sort(p.begin(),p.end());
			//for(k=0;k<p.size();k++)out<<p[k]<<'*';
			//out<<endl;
			//out<<w[i]+w[j]<<' ';
			//out<<endl;
			for(k=0;k<p.size()-1;k++)
			{
				//out<<p[k]<<endl;
				if(p[k]==p[k+1])
				{
					//out<<w[i]<<' '<<w[j]<<endl;
					dis=w[i]+w[j];
					if(dis<best)best=dis;
					break;
				}
			}
		}
	}
	if(start==end)best=0;
	if(best!=9999999)out<<best<<endl;
	else out<<-1<<endl;
	return 0;
}