码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3268 Silver Cow Party

时间:2014-08-22 14:16:48      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   art   

题目链接:http://poj.org/problem?id=3268

 

思路:dijkstra先求出目标点X到各个点的最短路径,这个便是奶牛回来的最短路径,然后将矩阵转置,在求一次X到各个点的最短路径,这个路径便是奶牛去的最短路径,最后将这个个路径           相加比较即可得出答案。

 

代码:

  

#include <iostream>
#include <cstring>
#define INF 999999999
using namespace std;

int N,M,X;
int e[1001][1001];//邻接矩阵储存地图 
int m[1001][1001];//转置后的矩阵 
int dis1[1001];//第一次求最短路径 
int book[1001];
int dis2[1001];//第二次求最短路径 

int main()
{
    //freopen("data.txt","r",stdin); 
    int a,b,c;
    int temp;
    int step;
    int res; 
    while(cin>>N>>M>>X)
    {
        //第一步 
        res = 0;
        //初始化
        memset(book,0,sizeof(book)); 
        
        for(int i=1;i<=N;i++)
            dis1[i] = INF;
        
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
            {
                if(j==i)
                    e[i][j] = 0;
                else
                    e[i][j] = INF;
            }
    
        for(int i=1;i<=M;i++)
        {
            cin>>a>>b>>c;    
            e[a][b] = c;
        }
        
        //初始化dis1数组
        for(int i=1;i<=N;i++)
        {
            dis1[i] = e[X][i];
        }
        
        //dijkstra算法核心 
        book[X] = 1;
        temp = X;
        for(int i=1;i<=N-1;i++)
        {
            step = INF;
            for(int j=1;j<=N;j++)
            {
                if(book[j]==0&&step>dis1[j])
                {
                    step = dis1[j];
                    temp = j;
                }
            }

            book[temp] = 1;
            
            for(int k=1;k<=N;k++)
            {
                if(dis1[k]>dis1[temp]+e[temp][k])
                    dis1[k] = dis1[temp]+e[temp][k];
            }
        }
         
         //第二步 
        //矩阵反转 
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=N;j++)
            {
                m[i][j] = e[j][i];
            }
         } 
         
         
         //初始化dis2 
         for(int i=1;i<=N;i++)
            dis2[i] = INF;
        for(int i=1;i<=N;i++)
        {
            dis2[i] = m[X][i];
        }
        
        memset(book,0,sizeof(book));
        
        //dijkstra算法核心 
        book[X] = 1;
        temp = X;
        for(int i=1;i<=N-1;i++)
        {
            step = INF;
            for(int j=1;j<=N;j++)
            {
                if(book[j]==0&&step>dis2[j])
                {
                    step = dis2[j];
                    temp = j;
                }
            }
            
            book[temp] = 1;
            
            for(int k=1;k<=N;k++)
            {
                if(dis2[k]>dis2[temp]+m[temp][k])
                    dis2[k] = dis2[temp]+m[temp][k];
            }
        }
        
        
        //第三步,进行相加比较得出结果 
        for(int i=1;i<=N;i++)
        {
            if(dis1[i]==INF||dis2[i]==INF)
                continue;
            else
                res = max(dis1[i]+dis2[i],res);
        }
        
        cout<<res<<endl;
        
    }
    return 0;
}

 

POJ 3268 Silver Cow Party

标签:style   blog   http   color   os   io   for   ar   art   

原文地址:http://www.cnblogs.com/ltwy/p/3929226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!