基础最短路四 POJ3268

来源:互联网 发布:linux 删除路由 编辑:程序博客网 时间:2024/05/19 03:22


POJ 3268 :http://poj.org/problem?id=3268

n为1000,m为100000

题目大意: 有很多牛分别从点X出发,到达各点,并返回回点X,问这些牛中经过的的最短路中,最大的最短路为多少。


   其实就是以X为起点的最短路,然后将边反转方向一下,再求一次最短路。

   两次和相加起来,扫一遍得到最大最短路。。。。

  

   用pos保存了每条边,两次输入到 edge里面。

   RE了很多次,后来发现错误是,把边数默认为 1000了。



依然是Spfa,很好用:

#include"cstdio"#include"iostream"#include"cstring"#include"algorithm"#include"vector"#include"cmath"#include"queue"using namespace std;#define INF 9999999#define inf 1009#define loop(x,y,z) for(x=y;x<z;x++)#define ll long longint n,m,s;int book[inf];int dis[inf];int ans[inf];int pos[100009][3];queue<int>q;struct node{    int to,w;    node(int i,int j)    {        to=i;        w=j;    }};vector<node>edge[inf];void init(){    int i;    loop(i,1,n+1)        edge[i].clear();    loop(i,1,n+1)        dis[i]=INF;    dis[s]=0;    memset(book,0,sizeof book);    while(!q.empty())q.pop();}void Spfa(){    q.push(s);    book[s]=1;    int i;    while(!q.empty())    {        int u=q.front();        q.pop();        book[u]=0;        int len=edge[u].size();        loop(i,0,len)        {            node& e=edge[u][i];            if(dis[e.to]>dis[u]+e.w)            {                dis[e.to]=dis[u]+e.w;                if(!book[e.to])                {                    q.push(e.to);                    book[e.to]=1;                }            }        }    }}int main(){    int i,j,k;    scanf("%d%d%d",&n,&m,&s);    loop(i,0,m)        scanf("%d%d%d",&pos[i][0],&pos[i][1],&pos[i][2]);    memset(ans,0,sizeof ans);    init();    loop(i,0,m)        edge[pos[i][0]].push_back(node(pos[i][1],pos[i][2]));    Spfa();    loop(i,1,n+1)        ans[i]+=dis[i];    init();    loop(i,0,m)        edge[pos[i][1]].push_back(node(pos[i][0],pos[i][2]));    Spfa();    loop(i,1,n+1)        ans[i]+=dis[i];    int big=0;    loop(i,1,n+1)        if(ans[i]>big)            big=ans[i];    printf("%d\n",big);    return 0;}


0 0
原创粉丝点击