NYOJ 115 Dijstra入门

来源:互联网 发布:java框架 编辑:程序博客网 时间:2024/05/17 02:20

传送门

思路:
暴乱城市为起点,求出到每个点的距离的最短路,在部队所在的点里找最小值。

#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<vector>using namespace std;#define LL long long#define INF 0x3f3f3f3fconst int MAXN=1005;int n,m,p,q,T;int mp[MAXN][MAXN],d[MAXN];int des[MAXN];bool vis[MAXN];void Dijstra(int q){    memset(vis,0,sizeof(vis));    for(int i=1;i<=m;i++)d[i]=(i==q?0:INF);    while(1){        int v=-1;        for(int i=1;i<=m;i++){            if(!vis[i]&&(v==-1||d[i]<d[v]))v=i;        }        if(v==-1)break;        vis[v]=1;        for(int i=1;i<=m;i++)d[i]=min(d[i],d[v]+mp[v][i]);    }}void init(){    for(int i=1;i<=m;i++)        for(int j=1;j<=m;j++)            mp[i][j]=(i==j?0:INF);}int a,b,l;int main(){    scanf("%d",&T);    while(T--){        scanf("%d%d%d%d",&n,&m,&p,&q);        for(int i=1;i<=n;i++){            scanf("%d",des+i);        }        init();        while(p--){          scanf("%d%d%d",&a,&b,&l);          if(mp[a][b])           mp[a][b]=mp[b][a]=min(mp[a][b],l);         else mp[a][b]=mp[b][a]=l;        }        int ans=INF;        Dijstra(q);        for(int i=1;i<=n;i++){            ans=min(ans,d[des[i]]);        }        cout<<ans<<endl;    }    return 0;}

再来个基于优先队列的dijstra。快不少

#include <iostream>#include<cstring>#include<cstdio>#include<vector>#include<queue>using namespace std;#define INF 0x3f3f3f3fconst int MAX=1005;typedef pair<int,int> pii;priority_queue< pii , vector<pii> , greater<pii> > Q;   //优先队列int edges[MAX][MAX];  //邻接表int T,m,n,p,q;int des[MAX];int d[MAX];  //最短路径路径长度void init(){    for(int i =1; i<=n; ++i)    {        for(int j =1; j<=n; ++j)        {            if(i == j)                edges[i][j] = 0;            else                edges[i][j] = INF;        }    }}void dijkstra(int v){    bool vis[MAX];    for(int i = 1; i <=n; ++i)    {        d[i]=(i==v?0:INF);    }    memset(vis,0,sizeof(vis));    Q.push(make_pair(d[v],v));  //v 起点    while(!Q.empty())    {        pii u = Q.top();        Q.pop();        int x = u.second;        if(vis[x]) continue;        vis[x] = true;        for(int j = 1; j <= n; ++j)        {            if(!vis[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j])            {                d[j] = d[x] + edges[x][j];                Q.push( make_pair(d[j],j) );            }        }    }}int main(){    int a,b,l;    scanf("%d",&T);    while(T--){        scanf("%d%d%d%d",&m,&n,&p,&q);        init();        for(int i=1;i<=m;i++)scanf("%d",des+i);        while(p--){            scanf("%d%d%d",&a,&b,&l);            if(edges[a][b])edges[a][b]=edges[b][a]=min(edges[a][b],l);            else edges[a][b]=edges[b][a]=l;        }        dijkstra(q);        int ans=INF;        for(int i=1;i<=m;i++)ans=min(ans,d[des[i]]);        printf("%d\n",ans);    }    return 0;}
1 0
原创粉丝点击