HDU 1874 畅通工程续

来源:互联网 发布:js 时间间隔 编辑:程序博客网 时间:2024/06/01 19:04

这里写图片描述
这里写图片描述

题目大意:对于中文题 没有什么可以说的 就是给个n个点 m个道路 求从某点到某点的最短路径

解题思路:标准的最短路径的模板 因为数据量较小 所以每种算法都可以过。下面我就贴上我过了得代码

Floyd算法

Memoey 1772 Time  62#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>#include <set>using namespace std;#define ll long long#define sc(x) scanf("%d",&x)#define dsc(x,y) scanf("%d%d",&x,&y)#define sssc(x)   scanf("%s",s)#define sdsc(x,y) scanf("%s %s",x,y)#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)#define pr(x) printf("%d\n",x)#define FOR(i,n,o) for(int i=o;i<=n;i++)#define lcr(a,b)  memset(a,b,sizeof(a))#define Inf 1<<29int n,m;int mp[100][100];int main(){    while(~dsc(n,m))    {        FOR(i,n,1)        {            FOR(j,n,1)            {                if(i!=j)                {                    mp[i][j]=Inf;                }                else                {                    mp[i][j]=0;                }            }        }        FOR(i,m,1)        {            int a,b,c;            sc(a);            a++;            sc(b);            b++;            sc(c);            mp[a][b]=min(mp[a][b],c);//注意里 有可能给你输入a b 相同 距离不同            mp[b][a]=mp[a][b];        }           FOR(k,n,1)          {            FOR(i,n,1)            {                FOR(j,n,1)                {                    if(i!=j&&j!=k)                    {                        mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);                    }                }            }          }        int t,w;        dsc(t,w);        if(mp[t+1][w+1]==Inf)           puts("-1");         else        pr(mp[t+1][w+1]);     }    return 0;}

Dijkstra算法

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>#include <set>using namespace std;#define ll long long#define sc(x) scanf("%d",&x)#define dsc(x,y) scanf("%d%d",&x,&y)#define sssc(x)   scanf("%s",s)#define sdsc(x,y) scanf("%s %s",x,y)#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)#define pr(x) printf("%d\n",x)#define FOR(i,n,o) for(int i=o;i<=n;i++)#define lcr(a,b)  memset(a,b,sizeof(a))#define Inf 1<<29int mp[205][205];int dis[205];int vis[205];int n,m;void dij(int s){       FOR(i,n,1)       {           vis[i]=0;           dis[i]=mp[s][i];       }       vis[s]=1;       dis[s]=0;       FOR(i,n,1)       {            int to=-1;            int d=Inf;            FOR(j,n,1)            {                if(!vis[j]&&d>dis[j])                {                    d=dis[j];                    to=j;                }            }            if(d==Inf)                break;            vis[to]=1;            FOR(j,n,1)            {                if(!vis[j]&&dis[j]>dis[to]+mp[to][j])                     dis[j]=dis[to]+mp[to][j];            }       }       return ;}int main(){    while(~dsc(n,m))    {        lcr(mp,0);        FOR(i,n,1)        {            FOR(j,n,1)            {                    mp[i][j]=Inf;            }        }        FOR(i,m,1)        {            int a,b,c;            ssc(a,b,c);            a++,b++;            if(mp[a][b]>c)            mp[a][b]=mp[b][a]=c;        }        int a,b;        dsc(a,b);        dij(a+1);        if(dis[b+1]==Inf)            puts("-1");        else        pr(dis[b+1]);    }    return 0;}

Bellman-Ford(贝尔曼)算法

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>#include <set>using namespace std;#define ll long long#define sc(x) scanf("%d",&x)#define dsc(x,y) scanf("%d%d",&x,&y)#define sssc(x)   scanf("%s",s)#define sdsc(x,y) scanf("%s %s",x,y)#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)#define pr(x) printf("%d\n",x)#define FOR(i,n,o) for(int i=o;i<=n;i++)#define lcr(a,b)  memset(a,b,sizeof(a))#define Inf 1<<29int dis[206];int vis[205];struct node{    int u;    int v;    int w;}q[205*205];int n,m;void bellman_floyd(int s){        FOR(i,n,0)        {            dis[i]=Inf;        }        dis[s]=0;        FOR(i,n,1)        {            for(int j=1;j<=2*m+1;j++)            {                  if(dis[q[j].u]+q[j].w<dis[q[j].v])                        dis[q[j].v]=dis[q[j].u]+q[j].w;            }        }        return ;}int main(){    while(~dsc(n,m))    {        for(int i=1;i<=2*m;i+=2)        {            ssc(q[i].u,q[i].v,q[i].w);            q[i+1].v=q[i].u;            q[i+1].u=q[i].v;            q[i+1].w=q[i].w;        }        int t,w;        dsc(t,w);        bellman_floyd(t);        if(dis[w]==Inf)            puts("-1");        else            pr(dis[w]);    }    return 0;}

END!!!!!!!!!!!!!!!!!!!!!!!!

2 0
原创粉丝点击