解题报告: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]<<"\n";
    //for(int i=1;i<=n;i++) printf("%d ",dis[i]);
    return 0;
}

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

猜你喜欢

转载自www.cnblogs.com/tlx-blog/p/12308204.html