前置知识spfa,差分约束
不会的建议先去做
洛谷P1993
最开始用队列,不知道为什么超时了,看别人的博客把队列换成栈就行了。我也这样换一下,不太懂。
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<stack>
using namespace std;
#define maxn 300010
int dis[maxn],head[maxn],cnt,vis[maxn];
struct node{
int to;
int from;
int w;
}edge[maxn*5];
void add(int u,int v,int w)
{
cnt++;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].from = head[u];
head[u] = cnt;
}
stack<int>q;
int spfa()
{
memset(dis,0x3f,sizeof dis);
q.push(1);
vis[1] = 1;
dis[1] = 0;
while(!q.empty())
{
int x = q.top();
q.pop();
vis[x] = 0;
for(int i=head[x];i;i=edge[i].from)
{
int to = edge[i].to;
if(dis[to]>dis[x]+edge[i].w)
{
dis[to] = dis[x]+edge[i].w;
if(!vis[to])
{
vis[to] = 1;
q.push(to);
}
}
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
spfa();
int ans = 0;
for(int i=1;i<=n;i++)
ans = max(dis[i],ans);
cout<<ans<<endl;
}