POJ 3268 基本dijkstra

来源:互联网 发布:python冒泡排序算法 编辑:程序博客网 时间:2024/05/26 02:20

比较简单,没什么好说的,几乎就是模版题了。

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using namespace std;const int maxn=100010;const int INF=1e9;int n,m,x,a,b,c,d[maxn],vis[maxn];struct Node{    int d,u;    bool operator < (const Node& a)const    {        return d>a.d;    }};struct Edge{    int u,v,w;};vector<Edge> edge;vector<int> g[maxn];void init(){    memset(d,0,sizeof(d));}void add_edge(int u,int v,int w){    Edge p;    p.u=u;    p.v=v;    p.w=w;    edge.push_back(p);    g[u].push_back(edge.size()-1);}void dijkstra(int u){   for(int i=1;i<=n;i++)    d[i]=INF;   memset(vis,0,sizeof(vis));   d[u]=0;   priority_queue<Node> q;   Node p;   p.d=d[u];   p.u=u;   q.push(p);   while(!q.empty())   {       Node t=q.top();       q.pop();       u=t.u;       if(vis[u])        continue;       vis[u]=true;       for(int k=0;k<g[u].size();k++)       {           Edge e=edge[g[u][k]];           if(d[e.v]>d[e.u]+e.w)           {               d[e.v]=d[e.u]+e.w;               Node tp;               tp.d=d[e.v];               tp.u=e.v;               q.push(tp);           }       }   }}int main(){    while(scanf("%d%d%d",&n,&m,&x)!=EOF)    {        init();        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            add_edge(a,b,c);        }        int ans=-1;        for(int i=1;i<=n;i++)        {            int sum=0;             dijkstra(i);             sum+=d[x];            dijkstra(x);            sum+=d[i];           ans=max(ans,sum);        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击