HDU2680---Choose the best route(dijkstra&&SPFA)

来源:互联网 发布:零基础学c语言 pdf 编辑:程序博客网 时间:2024/04/30 06:12
#include<stdio.h>#include<string.h>#define inf 0xffffffusing namespace std;int map[1010][1010],dist[1010],vis[1010],n,m,s;int dijkstra(){memset(vis,0,sizeof(vis));for(int i=0;i<=n;i++)dist[i]=inf;vis[0]=1;dist[0]=0;for(int i=0;i<=n;i++){int pos=0,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%d",&n,&m,&s)!=EOF){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 a,b,c;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);if(map[a][b]>c) map[a][b]=c;}int st,t,min=99999;scanf("%d",&st);for(int i=0;i<st;i++){scanf("%d",&t);map[0][t]=0;}dijkstra();if(dist[s]==inf)printf("-1\n");elseprintf("%d\n",dist[s]);}}

SPFA

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



 

0 0