解题报告:luogu P2299

题目链接:P2299 Mzc和体委的争夺战
单源最短路板子题吗,体面晦涩难懂(语文不好),以为是有向图,只有(30pts),其实是无向的,我使用了刚学来的(SPFA),通过了此题:

(Code):

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int inf=2147483647;
queue<int> q;
struct node
{
	int to,nxt,w;
}e[200005];
int head[200005],cnt=0;
void add(int u,int v,int c)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	e[cnt].w=c;
	head[u]=cnt;
}
int dis[200005],vis[200005];
void SPFA()
{
	while(!(q.empty()))
	{
		int k=q.front();
		q.pop();
		vis[k]=0;
		for(int i=head[k];i;i=e[i].nxt)
		{
			int j=e[i].to;
			if(dis[j]>dis[k]+e[i].w)
			{
				dis[j]=dis[k]+e[i].w;
				if(!vis[j]) q.push(j),vis[j]=1;
			}
		}
	}
}
void init(int n)
{
	for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
}
int n,m;
int l,r,p;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&l,&r,&p);
		add(l,r,p);
	}
	init(n);
	dis[1]=0;
	vis[1]=1;
	q.push(1);
	SPFA();
	cout<<dis[n]<<"
";
	//for(int i=1;i<=n;i++) printf("%d ",dis[i]);
	return 0;
}

可以说是(SPFA)板子,背一下

原文地址:https://www.cnblogs.com/tlx-blog/p/12308204.html