记录编号 83250 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2013-12-01 15:20:30 内存使用 0.32 MiB
显示代码纯文本
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

typedef vector<int>::iterator vit;

ifstream in("route.in");
ofstream out("route.out");

int n;
int s,e;
int **map;
int **map2;
vector<int> bad;

void input();
void ques1();
void ques2();
int djs(int, int, int **);
int djs(int *);//record approachs

int main()
{
	input();
	ques1();
	ques2();
	return 0;
}

void input()
{
	in>> n>> s>> e;
	map=new int *[n+1];
	map2=new int *[n+1];
	map[0]=new int [n+1];
	map2[0]=new int [n+1];
	for(int i=1; i!=n+1; ++i)
	{
		map[i]=new int [n+1];
		map2[i]=new int [n+1];
		for(int j=1; j!=n+1; ++j)
		{
			in>> map[i][j];
			map2[i][j]=map[i][j];
		}
	}
	int b;
	in>>b;
	if(b==0)
	{
		return ;
	}
	for(int i=0; i!=b; ++i)
	{
		int itemp;
		in>>itemp;
		bad.push_back(itemp);
	}
	return ;
}

void ques1()
{
	if(!bad.empty())
	{
		for(vit it(bad.begin()); it!=bad.end(); ++it)
		{
			for(int i=1; i!=n+1; ++i)
			{
				map2[i][*it]=0;
				//map2[*it][i]=0;
			}
		}
	}
	out<< djs(0, 0, map2)<< ' ';
	return ;
}

void ques2()
{
	int *way=new int [n+1];
	memset(way, 0, sizeof(int)*(n+1));
	int min(djs(way));
	out<< min<< ' ';
	int p(e);
	int min2(1<<(8*sizeof(int)-2));
	while(p!=s)
	{
		int itemp(djs(way[p], p, map));
		if(itemp<min2&&itemp>min)
		{
			min2=itemp;
		}
		p=way[p];
	}
	out<< min2<< endl;
	return ;
}

struct node
{
	int now;
	int lenth;
	int next;
	node &operator=(node lh)
	{
		now=lh.now;
		lenth=lh.lenth;
		next=lh.next;
		return *this;
	}
};

bool operator<(node rh, node lh)
{
	return rh.lenth<lh.lenth;
}

bool operator>(node rh, node lh)
{
	return rh.lenth>lh.lenth;
}

int djs(int st, int en, int **m)
{
	priority_queue<node, vector<node>, greater<node> > q;
	int *is=new int [n+1];
	for(int i=1; i!=n+1; ++i)
	{
		is[i]=1;
	}
	node ntemp;
	ntemp.next=s;
	ntemp.lenth=0;
	q.push(ntemp);
	is[s]=0;
	while(!q.empty())
	{
		ntemp=q.top();
		q.pop();
		if(ntemp.next==e)
		{
			return ntemp.lenth;
		}
		int lenth(ntemp.lenth);
		int now(ntemp.next);
		for(int i=1; i!=n+1; ++i)
		{
			if(m[now][i]!=0&& is[i])
			{
				if(now==st&& i==en)
				{
					continue;
				}
				ntemp.next=i;
				ntemp.lenth=lenth+m[now][i];
				q.push(ntemp);
			}
		}
		is[now]=0;
	}
	return 0;
}

int djs(int *ar)
{
	priority_queue<node, vector<node>, greater<node> > q;
	int *is=new int [n+1];
	for(int i=1; i!=n+1; ++i)
	{
		is[i]=1;
	}
	node ntemp;
	ntemp.next=s;
	ntemp.lenth=0;
	q.push(ntemp);
	is[s]=0;
	while(!q.empty())
	{
		ntemp=q.top();
		q.pop();
		if(is[ntemp.next])
		ar[ntemp.next]=ntemp.now;
		if(ntemp.next==e)
		{
			return ntemp.lenth;
		}
		int lenth(ntemp.lenth);
		int now(ntemp.next);
		ntemp.now=now;
		for(int i=1; i!=n+1; ++i)
		{
			if(map[now][i]!=0&&is[i])
			{
				ntemp.next=i;
				ntemp.lenth=lenth+map[now][i];
				q.push(ntemp);
			}
		}
		is[now]=0;
	}
	return 0;
}