[USACO09OCT]热浪Heat Wave,洛谷之提高历练地,最短路问题

正题

      第一题:[USACO09OCT]热浪Heat Wave

      这一题很明显就是n个点,m条边。求S点到T点的最短路径长度。

      有dijkstra和SPFA两种做法。在这不多说。

代码<有评论我会考虑贴Dijkstra>

#include
#include
#include
#include
using namespace std;

int t,c,ts,te;
struct edge{int y,c,next;};
edge s[12410];
int len=0;
struct node{int x,d;};
queue f; 
int h[5010];
int first[5010];
bool tf[5010];

void ins(int x,int y,int c)
{
    len++;
    s[len].y=y;s[len].next=first[x];first[x]=len;
    s[len].c=c;
}

void SPFA(int st,int t)
{
    f.push((node){st,0});
    memset(h,63,sizeof(h));
    h[st]=0;
    while(!f.empty())
    {
        node x=f.front();
        f.pop();
        tf[x.x]=false;
        for(int i=first[x.x];i!=0;i=s[i].next)
        {
            int y=s[i].y;
            if(h[y]>h[x.x]+s[i].c) 
            {
                h[y]=h[x.x]+s[i].c; 
                if(tf[y]==false)
                {
                    tf[y]=true;
                    f.push((node){y,h[y]});
                }
            }
        }
    }
    printf("%d",h[t]);
    return ;
}

int main()
{
    scanf("%d %d %d %d",&t,&c,&ts,&te);
    for(int i=1;i<=c;i++)
    {
        int x,y,q;
        scanf("%d %d %d",&x,&y,&q);
        ins(x,y,q);
        ins(y,x,q);
    }
    SPFA(ts,te);
}

你可能感兴趣的:([USACO09OCT]热浪Heat Wave,洛谷之提高历练地,最短路问题)