读题真的好恶心
实际上是考察了spfa中路径记录的问题
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int point;
int nxt;
int weight;
};
node line[1000000];
int head[1001],tail;
int dis[1010];
bool can[1010][1010];
bool inque[1010];
int pre[1010];
int n,m;
queue<int>q;
void add(int a,int b,int c)
{
line[++tail].point=b;
line[tail].nxt=head[a];
line[tail].weight=c;
head[a]=tail;
}
void spfa(int base)
{
for(int i=2;i<=n;i++)
{
inque[i]=false;
dis[i]=0x7ffffff;
}
dis[1]=0;
inque[1]=true;
q.push(1);
while(!q.empty())
{
int pass=q.front();
q.pop();
inque[pass]=false;
for(int need=head[pass];need;need=line[need].nxt)
{
if(dis[line[need].point]>dis[pass]+line[need].weight&&!can[pass][line[need].point])
{
dis[line[need].point]=dis[pass]+line[need].weight;
if(base)
pre[line[need].point]=pass;
if(!inque[line[need].point])
{
q.push(line[need].point);
inque[line[need].point];
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
int maxn=-0x7fffffff;
spfa(1);
for(int i=n;i;i=pre[i])//倒叙便利十分好实现,如果是输出路径的话就可以再来一个stack了
{
can[i][pre[i]]=can[pre[i]][i]=true;
spfa(0);
maxn=max(dis[n],maxn);
can[i][pre[i]]=can[pre[i]][i]=false;
}
printf("%d",maxn);
}