题目链接:http://poj.org/problem?id=3159
解析:仍然是spfa+静态邻接表求最短路问题,但是只能用stack,用queue就会超时,不知道为什么╮(╯▽╰)╭,
//需要注意,虽然看似是求最长路,其实还是求最短路,因为如果1->2权值30,2->3权值20,1->2权值10,我们只能选权值10的,因为要使所有人都满意
//这题用queue就会TLE,但是用stack就AC,不明觉厉
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<stdlib.h>
#define Max 100000000
using namespace std;
struct edge
{
int x,y,len;
}e[151000];
int n,m;
int fir[30100],nex[151000],flag[30100],dist[30100];
int sum = 0;
void spfa()
{
stack<int>S;
while(!S.empty())
S.pop();
memset(flag,0,sizeof(flag));
for(int i = 1 ; i <= n ; i ++)
dist[i] = Max;
dist[1] = 0;
flag[1] = 1;
S.push(1);
while(!S.empty())
{
int t = S.top();
S.pop();
for(int i = fir[t] ;i > 0 ; i = nex[i])
{
if(dist[e[i].y] > dist[t] + e[i].len)
{
dist[e[i].y] = dist[t] + e[i].len;
if(!flag[e[i].y])
{
flag[e[i].y ] = 1;
S.push(e[i].y);
}
}
}
flag[t] = 0;
}
if(dist[n] != Max)
sum = dist[n];
}
int main()
{
memset(fir,-1,sizeof(fir));
memset(nex,0,sizeof(nex));
memset(e,0,sizeof(e));
scanf("%d%d",&n,&m);
for(int i = 1 ; i <= m ; i++)
{
scanf("%d%d%d",&e[i].x ,&e[i].y ,&e[i].len );
nex[i] = fir[e[i].x];
fir[e[i].x] = i;
}
spfa();
printf("%d\n",sum);
// system("pause");
return 0;
}