最短路Floyd、Dijkstra

来源:互联网 发布:mysql主键从1开始 编辑:程序博客网 时间:2024/06/08 09:28
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std; #define INF 0xfffffffint pri[1010][1010];//两个顶点之间距离int dis[1010];//起点到该点的最短距离 int vis[1010];//标记数组 int n,m;void floyd(){    for(int k=1;k<=n;k++)//中间点     {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                pri[i][j]=min(pri[i][j],pri[i][k]+pri[k][j]);             }         }     }} void dijkstra(){    memset(vis,0,sizeof(vis));    vis[1]=1;    for(int i=2;i<=n;i++)    dis[i]=pri[1][i];    for(int i=0;i<n;i++)    {        int M=INF,k=-1;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<M)            M=dis[j],k=j;        }        if(k==-1)        return ;        vis[k]=1;        for(int j=1;j<=n;j++)            if(!vis[j]&&dis[j]>dis[k]+pri[k][j])            dis[j]=dis[k]+pri[k][j];    }} int main() {    while(scanf("%d%d",&n,&m)!=EOF,n||m)    {         for(int i=1;i<=n;i++)         for(int j=1;j<=n;j++)         pri[i][j]=i==j?0:INF;         for(int i=1;i<=m;i++)         {            int a,b,c;scanf("%d%d%d",&a,&b,&c);            if(pri[a][b]>c)            pri[a][b]=pri[b][a]=c;         }         //dijkstra();         floyd();         printf("%d\n",pri[1][n]);    }    return 0; }
原创粉丝点击