POJ Candies——差分约束+spfa 水题

前置知识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;
}

猜你喜欢

转载自blog.csdn.net/naiue/article/details/107551076