HDU1874---畅通工程续(dijkstra&&SPFA)

来源:互联网 发布:linux vi 搜索 下一个 编辑:程序博客网 时间:2024/05/21 07:08
#include<stdio.h>#include<string.h>#define M 1000007#define inf 0xffffffusing namespace std;int n,m,map[222][222],dist[222],vis[222];void dijkstra(int u){    memset(vis,0,sizeof(vis));    for(int i=0;i<n;i++)        dist[i]=map[u][i];    dist[u]=0;    vis[u]=1;    for(int i=0;i<n;i++)    {        int pos=u,min=inf;        for(int j=0;j<n;j++)            if(!vis[j] && dist[j]<min)        {            pos=j;            min=dist[j];        }        vis[pos]=1;        for(int j=0;j<n;j++)        {            if(!vis[j] && dist[j]>dist[pos]+map[pos][j])                dist[j]=dist[pos]+map[pos][j];        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)            map[i][j]=inf;        int a,b,c;        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&c);            if(c<map[a][b]) map[a][b]=map[b][a]=c;        }        int q,w;        scanf("%d%d",&q,&w);        dijkstra(q);        if(dist[w]!=inf)        printf("%d\n",dist[w]);        else printf("-1\n");    }}


SPFA

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#define inf 0x3f3f3f3;int map[1100][1100],dis[1100],used[1100],t,s,d,n,m,st,ed;void inti(){    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        if(i==j) map[i][j]=0;        else map[i][j]=inf;}int SPFA(int u){    for(int i=0;i<n;i++)        dis[i]=inf;    dis[u]=0;    used[u]=1;    queue <int> q;    q.push(u);    while(!q.empty())    {        int now=q.front();        q.pop();        used[now]=0;        for(int i=0;i<n;i++)        {        if(dis[i]>dis[now]+map[now][i])            {dis[i]=dis[now]+map[now][i];                if(!used[i])                {                    q.push(i);                    used[i]=1;                }            }        }    }    int MIN=inf;    if(dis[ed]==MIN) return -1;    else return dis[ed];}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {   inti();        int a,b,c;        for(int i=0;i<m;i++)        {scanf("%d%d%d",&a,&b,&c);        if(map[a][b]>c)            map[a][b]=map[b][a]=c;        }        scanf("%d%d",&st,&ed);        int k=SPFA(st);        printf("%d\n",k);    }}


 Floyd

#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <vector>#include<queue>#include <string>#include <stack>using namespace std;#define inf 0xfffffint map[205][205];int n,m;void init(){    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)            if(i==j) map[i][j]=0;        else        map[i][j]=map[j][i]=inf;}void floyd(){   for(int k=0;k<n;k++)        for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        if(map[i][k]+map[k][j]<map[i][j])           map[i][j]=map[i][k]+map[k][j];}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        int a,b,c;        for(int i=0;i<m;i++){            scanf("%d%d%d",&a,&b,&c);            if(map[a][b]>c)                map[a][b]=map[b][a]=c;        }        floyd();        scanf("%d%d",&a,&b);        if(map[a][b]==inf)            printf("-1\n");        else        printf("%d\n",map[a][b]);    }}


 

0 0
原创粉丝点击