codevs 1557 热浪

来源:互联网 发布:d h算法 编辑:程序博客网 时间:2024/04/30 22:02

codevs 1557 热浪

就是求最短路问题。

题解1(spfa):

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn=6500*2;//双向边struct cc{    int from,to,cost;}es[maxn];int first[maxn],next[maxn];int dis[maxn];bool vis[maxn];int tot=0;void build(int ff,int tt,int pp){    es[++tot]=(cc){ff,tt,pp};    next[tot]=first[ff];    first[ff]=tot;}queue<int>q;void spfa(int s){    dis[s]=0;    q.push(s);    vis[s]=1;    while(!q.empty())    {        int v=q.front(); q.pop();        vis[v]=0;        for(int i=first[v];i;i=next[i])        {            int u=es[i].to;            if(dis[u]>dis[v]+es[i].cost)            {                dis[u]=dis[v]+es[i].cost;                if(!vis[u])                {                    q.push(u);                    vis[u]=1;                }            }        }    }}int main(){    memset(dis,63,sizeof(dis));    int t,c,ts,te;    scanf("%d%d%d%d",&t,&c,&ts,&te);    for(int i=1;i<=c;i++)    {        int rs,re,ci;        scanf("%d%d%d",&rs,&re,&ci);        build(rs,re,ci);        build(re,rs,ci);    }    spfa(ts);    printf("%d",dis[te]);    return 0;}

题解2(Dijkstra):

#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=6500*2;struct cc{    int from,to,cost;}es[maxn];int first[maxn],next[maxn];bool vis[maxn];struct edge{    int num,dis;};bool operator < (edge a,edge b){    return a.dis>b.dis;}int tot=0;void build(int ff,int tt,int pp){    es[++tot]=(cc){ff,tt,pp};    next[tot]=first[ff];    first[ff]=tot;}int dis[maxn];priority_queue<edge>q;void Dijkstra(int s){    dis[s]=0;    q.push((edge){s,dis[s]});    while(!q.empty())    {        edge v=q.top(); q.pop();        for(int i=first[v.num];i;i=next[i])        {            int u=es[i].to;            if(dis[u]>dis[v.num]+es[i].cost)            {                dis[u]=dis[v.num]+es[i].cost;                q.push((edge){u,dis[u]});            }        }    }}int main(){    memset(dis,63,sizeof(dis));    int T,C,Ts,Te;    scanf("%d%d%d%d",&T,&C,&Ts,&Te);    for(int i=1;i<=C;i++)    {        int rs,re,ci;        scanf("%d%d%d",&rs,&re,&ci);        build(rs,re,ci);        build(re,rs,ci);    }    Dijkstra(Ts);    printf("%d",dis[Te]);    return 0;}
2 0
原创粉丝点击