ickchen2

PKU 3268 最短路

/*一道双向求最短路的题...不要建两个VECTOR来利用传参求解,VECTOR传过去特别慢,利用记边,然后构两次图,来达到目的*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=10000;
const int maxm=1<<29;
int n,m,o;
vector< pair<int,int> > g[maxn];
long long dis[maxn];//,pre[maxn],cnt[maxn];cnt[i]>n则表示有负环
int e[3][maxn];

bool spfa(int s)
{
 queue<int> que;
 bool inque[maxn];
memset(inque,0,sizeof(inque));
// memset(pre,0,sizeof(pre));memset(cnt,0,sizeof(cnt));
 que.push(s);inque[s]=1;
 for(int i=0;i<=n;i++)dis[i]=maxm;
 dis[s]=0; //pre[s]=s;cnt[s]++;
 while(!que.empty())
 {
  int v=que.front();
  que.pop();inque[v]=0;
  for(int i=0;i<g[v].size();i++)
  {
   int u=g[v][i].first;
   if(dis[v]+g[v][i].second < dis[u])
   {
    dis[u]=dis[v]+g[v][i].second;// pre[u]=i;cnt[u]++;if(cnt[u]>n)return 0;
    if(!inque[u])
    {
     que.push(u);
     inque[u]=1;
    }
   }
  }
 }
 return 1;
}

long long ans;
int t;
int d[maxn];
int main()
{
    //freopen("3268.txt","r",stdin);
    int s;
 {
  scanf("%d%d%d",&n,&m,&s);
   for(int i=0;i<=n;i++)g[i].clear();
  for(int i=0;i<m;i++)
  {
   scanf("%d%d%d",&e[0][i],&e[1][i],&e[2][i]);
   g[e[0][i]].push_back(make_pair(e[1][i],e[2][i]));
  }
  spfa(s);
  for(int i=1;i<=n;i++)
  {
      d[i]+=dis[i];
        }
        for(int i=1;i<=n;i++)g[i].clear();
        for(int i=0;i<m;i++)
        {
            g[e[1][i]].push_back(make_pair(e[0][i],e[2][i]));
        }
  spfa(s);
  for(int i=1;i<=n;i++)
  {
      d[i]+=dis[i];
        }
        int ma=0;
        for(int i=1;i<=n;i++)
        {
            ma=max(d[i],ma);
        }
  printf("%d\n",ma);
 }
 return 0;
}

posted on 2008-09-08 10:29 神之子 阅读(210) 评论(0)  编辑 收藏 引用 所属分类: ACM题解


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜