⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2135.txt

📁 北大ACM题目例程 详细的解答过程 程序实现 算法分析
💻 TXT
字号:


#include"iostream.h"
#include"stdio.h"
#include"vector"
using namespace std;
struct edge
{
	int from;
	int to;
	int len;
	int opp;
};

vector<edge> e[1010];
int from[1010],dis[1010],n,m;
bool sign[1010];
edge *along[1010];

void dijstra()
{
	int i,j,k,to;
	for(i=0;i<n;i++)
	{
		sign[i]=0;
		dis[i]=999999999;
	}

	sign[0]=0;
	from[0]=-1;
	dis[0]=0;

	for(;;)
	{
		k=-1;
		for(j=0;j<n;j++)
			if(!sign[j]&&(k<0||dis[j]<dis[k]))
				k=j;
		if(k<0)break;
		
		sign[k]=1;
		
		for(j=0;j<e[k].size();j++)
			if(dis[to=e[k][j].to]>dis[k]+e[k][j].len)
			{
				dis[to]=dis[k]+e[k][j].len;
				from[to]=k;
				sign[to]=0;
				along[to]=&e[k][j];
			}
	}
}

void init()
{
	int i,a,b,c;
	edge eg;
	scanf("%d %d",&n,&m);
	
	for(i=0;i<n;i++)
		e[i].clear();

	for(i=0;i<m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		a--,b--;
		eg.len=c;
		
		eg.to=b;eg.from=a;
		e[a].push_back(eg);
		
		eg.to=a;eg.from=b;
		e[b].push_back(eg);

		e[a][e[a].size()-1].opp=e[b].size()-1;
		e[b][e[b].size()-1].opp=e[a].size()-1;
	}
}

int ans;
void doit()
{
	int i;
	dijstra();
	ans=dis[n-1];
		
	i=n-1;
	while(from[i]>=0)
	{
		e[i][along[i]->opp].len*=-1;
		along[i]->len=99999999;
		i=from[i];
	}
	dijstra();
	ans+=dis[n-1];
}

int main()
{
	init();
	doit();
	printf("%d\n",ans);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -