比赛 20121009 评测结果 AWWWWWAWW
题目名称 最长路 最终得分 22
用户昵称 鷐栩 运行时间 0.003 s
代码语言 C++ 内存使用 7.01 MiB
提交时间 2012-10-09 21:53:33
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
int re[1001][1001];// 邻接矩阵  
int tt[10001];// 队列 数组 
bool in[1001];// 标记每个点是否已经在队里 
int d[1001];// 从start 到 每个点的最优距离数组  
/* 
 	我理解的SPFA就是每次通过队头的元素去松弛跟他有关系的点,并把这些点加入队尾。
	队头出队。
	这个过程一直持续到都不能在松弛为止。
	如果一个点从队列进进出出超过n次,那么这个图是有问题的,即有负环。  
	其间有个d数组记录距离。
	最后返回他就好了。 
*/
int n;
int spfa(int start,int finish)
{
    freopen("longest.in","r",stdin);
    freopen("longest.out","w",stdout);
	memset(in,0,sizeof(in));
	memset(d,-1,sizeof(d));
	int i,head,end;
	head=end=0;
	tt[head]=start;
	d[start]=0;
	while (head<=end)
	{
		int x=tt[head];
		for (i=1;i<=n;i++)// 松弛  // 
			if (re[x][i]>0&&re[x][i]+d[x]<d[i])
			{
				d[i]=re[x][i]+d[x];//更新最优解 
				if (!in[i])//入队 
				{
					end++;
					tt[end]=i;
					in[i]=1;
				}
			}
		in[x]=0;//队头出队  
		head++;
	}
	return d[finish];
}
int main()
{
	int m,i,x,y,z;
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		re[x][y]=z;
		re[y][x]=z;
	}
	printf("%d\n",spfa(1,n));
	//system("pause");
	return 0;
}