比赛 防止isaac的小练习day2 评测结果 AAAAAAAAA
题目名称 道路重建 最终得分 100
用户昵称 Mealy 运行时间 0.017 s
代码语言 C++ 内存使用 0.34 MiB
提交时间 2016-11-02 10:13:44
显示代码纯文本
#include <cstdio>
#include <vector>
#include <queue>
#include <string>
#include <cstring>


using namespace std;


const int nmax=186;
const int INF=1<<29;


int n,m;
int tmpfrom,tmpto,tmplen;

int d;
int des[nmax][nmax]={0};
int dis[nmax]={0};

class edge
{
public:
	int from,to;
	int len;
	int ext;
};

int start,end;


vector<edge> G[nmax];


class SSSPFA
{
public:
	bool inqueue[nmax];
	queue<int > Q;
	void SPreDo(int tmps)
	{
		for(int i=1;i<=n;i++)
		{
			dis[i]=INF;
		}
		dis[tmps]=0;
		
		
		memset(inqueue,0,sizeof(inqueue));
		
		
		Q.push(tmps);
		inqueue[tmps]=1;
	}
	void SPFA(int tmps)
	{
		SPreDo(tmps);
		while(!Q.empty())
		{
			int tmpx=Q.front();
			Q.pop();
			inqueue[tmpx]=0;
			
			
			for(int i=0;i<G[tmpx].size();i++)
			{
				int tmpv=G[tmpx][i].to;
				if(dis[tmpv]>dis[tmpx]+G[tmpx][i].ext)
				{
					dis[tmpv]=dis[tmpx]+G[tmpx][i].ext;
					
					
					if(!inqueue[G[tmpx][i].to])
					{
						inqueue[G[tmpx][i].to]=1;
						Q.push(G[tmpx][i].to);
					}


				}
			}
		}
	}
}FJ;


void PreDo()
{
	
	freopen("rebuild.in","r",stdin);
	freopen("rebuild.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&tmpfrom,&tmpto,&tmplen);
		G[tmpfrom].push_back((edge){tmpfrom,tmpto,tmplen,0});
		G[tmpto].push_back((edge){tmpto,tmpfrom,tmplen,0});
	}
	
	
	scanf("%d",&d);
	for(int i=1;i<=d;i++)
	{
		scanf("%d%d",&tmpfrom,&tmpto);
		des[tmpfrom][tmpto]=1;
		des[tmpto][tmpfrom]=1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<G[i].size();j++)
		{
			edge& e=G[i][j];
			if(des[e.from][e.to]==1)
			{
				e.ext=e.len;
			}
		}
	}
	
	
	scanf("%d%d",&start,&end);
	
	
}


int main()
{
	PreDo();
	FJ.SPFA(start);
	printf("%d\n",dis[end]);
	return 0;
}