hdu 1874畅通工程续+2544最短路+3790最短路径(dijkstra算法入门题)

来源:互联网 发布:hsv颜色模型算法实现 编辑:程序博客网 时间:2024/05/17 00:02

1874

#include <iostream>#include <string.h>#define maxn 300#define INF 0x3f3f3f3fusing namespace std;int a[maxn][maxn];int low[maxn];bool flag[maxn];void DIJ(int begin,int n)///输入起始点,和顶点个数{    int k;    memset(flag,false,sizeof(flag));    flag[begin]=true;    for(int i=0; i<=n; i++)        low[i]=a[begin][i];    for (int i = 1; i < n ; ++i)    {        int min=INF;        for(int j=0; j<n; j++)            if(!flag[j]&&low[j]<min)            {                min=low[j];                k=j;            }        flag[k]=true;        for(int j=0; j<n; j++)            if(!flag[j]&&a[k][j]+low[k]<low[j])                low[j]=a[k][j]+low[k];    }}int main(){    int n,m,x,y,d,begin,t;    while(cin>>n>>m)    {        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)                if(i==j)                    a[i][j]=0;                else                    a[i][j]=INF;        for(int i=0; i<m; i++)        {            cin>>x>>y>>d;            if(d<a[x][y])                a[x][y]=a[y][x]=d;        }        cin>>begin>>t;        DIJ(begin,n);        if(low[t]<INF)            cout<<low[t]<<endl;        else            cout<<"-1"<<endl;    }    return 0;}

2544

#include <iostream>#include <string.h>#define maxn 300#define INF 0x3f3f3f3fusing namespace std;int a[maxn][maxn];int low[maxn];bool flag[maxn];void DIJ(int begin,int n){   int k;    memset(flag,false,sizeof(flag));   flag[begin]=true;   for(int i=1; i<=n; i++)   low[i]=a[begin][i];   for (int i = 2; i <= n ; ++i)      {      int min=INF;      for(int j=1; j<n; j++)      if(!flag[j]&&low[j]<min)      {                min=low[j];                k=j;      }      flag[k]=true;      for(int j=1; j<=n; j++)      if(!flag[j]&&a[k][j]+low[k]<low[j])      low[j]=a[k][j]+low[k];      }   }int main(){    int n,m,x,y,d;    while(cin>>n>>m&&(m||n))    {    for(int i=1;i<=n;i++)    for(int j=1;j<=n;j++)    if(i==j)    a[i][j]=0;    else     a[i][j]=INF;    for(int i=0; i<m; i++)    {           cin>>x>>y>>d;           if(d<a[x][y])           a[x][y]=a[y][x]=d;    }    DIJ(1,n);    if(low[n]<INF)    cout<<low[n]<<endl;    }    return 0;}

3790

#include <iostream>#include <string.h>#include <stdio.h>#define maxn 1005#define INF 0x3f3f3f3fusing namespace std;int dis[maxn][maxn];int cost[maxn][maxn];int lowdis[maxn];bool flag[maxn];int lowcost[maxn];void DIJ(int begin,int n){    int k;    memset(flag,false,sizeof(flag));    flag[begin]=true;    for(int i=1; i<=n; i++)    {        lowdis[i]=dis[begin][i];        lowcost[i]=cost[begin][i];    }    for (int i = 1; i < n ; ++i)    {        int mindis=INF,mincost=INF;        for(int j=1; j<=n; j++)            if(!flag[j]&&lowdis[j]<mindis)            {                mindis=lowdis[j];                mincost=lowcost[j];                k=j;            }            else if(!flag[j]&&lowdis[j]==mindis&&lowcost[j]<mincost)            {                mindis=lowdis[j];                mincost=lowcost[j];                k=j;            }        flag[k]=true;        for(int j=1; j<=n; j++)            if(!flag[j]&&dis[k][j]+lowdis[k]<lowdis[j])            {                lowdis[j]=dis[k][j]+lowdis[k];                lowcost[j]=cost[k][j]+lowcost[k];            }            else if(!flag[j]&&dis[k][j]+lowdis[k]==lowdis[j]&&lowcost[k]+cost[k][j]<lowcost[j])            {                lowdis[j]=dis[k][j]+lowdis[k];                lowcost[j]=cost[k][j]+lowcost[k];            }    }}int main(){    int n,m,x,y,d,c,begin,t;    while(scanf("%d%d",&n,&m),(m||n))    {        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                if(i==j)                {                    dis[i][j]=0;                    cost[i][j]=0;                }                else                {                    dis[i][j]=INF;                    cost[i][j]=INF;                }        for(int i=0; i<m; i++)        {            scanf("%d%d%d%d",&x,&y,&d,&c);            if(d<dis[x][y]||(dis[x][y]==d&&cost[x][y]>c))            {                dis[x][y]=dis[y][x]=d;                cost[x][y]=cost[y][x]=c;            }        }        scanf("%d%d",&begin,&t);        DIJ(begin,n);        cout<<lowdis[t]<<" "<<lowcost[t]<<endl;    }    return 0;}


阅读全文
0 0
原创粉丝点击