hdu 2680 Choose the best route(最短路)

来源:互联网 发布:网上怎么开淘宝网店 编辑:程序博客网 时间:2024/06/11 00:14

题目:

        链接:点击打开链接

题意:

        

思路:

        自己加一个虚拟源点,把起点集合中的点连接到虚拟点上,并将路径长度设为0,就构成了一个由n+1个点组成的单源最短路算法。

代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define INF 100000000const int N = 1010;int n,m,s;int map[N][N],dis[N];int dijkstra(int v){    int vis[N];    memset(vis,0,sizeof(vis));    for(int i=1; i<=n; i++)        dis[i] = map[v][i];    dis[v] = 0;    for(int i=1; i<n; i++)    {        int x,minn = INF;        for(int y=1; y<=n; y++)        {            if(!vis[y] && minn > dis[y])                minn = dis[x=y];        }        vis[x] = 1;        if(minn == INF)            break;        for(int y=1; y<=n; y++)        {            if(dis[y] > dis[x] + map[x][y])                dis[y] = dis[x] + map[x][y];        }    }    return dis[s];}int main(){    //freopen("input.txt","r",stdin);    int p,q,t,to;    int w;    while(scanf("%d%d%d",&n,&m,&s) != EOF)    {        for(int i=0; i<=n; i++)        {            for(int j=0; j<=n; j++)                map[i][j] = INF;        }        for(int i=1; i<=m; i++)        {            scanf("%d%d%d",&p,&q,&t);            if(map[p][q] > t)                map[p][q] = t;        }        scanf("%d",&w);        for(int i=1; i<=w; i++)//设立虚拟点        {            scanf("%d",&to);            map[0][to] = 0;        }        printf("%d\n",dijkstra(0) == INF ? -1 : dijkstra(0));    }    return 0;}

----------------------------------------------------------------------

战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~


0 0
原创粉丝点击