Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

贴代码,整理,飘过~

Posted by yingxiang720 at 2011-04-24 19:37:10 on Problem 3268
题意:
描述  一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。 每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。 求每头牛要来回的最短时间。  
输入 第一行:三个用空格分开的整数:N,M和X 第2到第M+1行:第i+1描述路i,通过三个用空格分开的整数: Ai, Bi和Ti. 是对于从Ai号田到 Bi号田的描述,需要Ti的时间. 
输出 第一行:一个整数:对于每头牛所必须花费的时间.(在这段时间内,每头牛可以来回)

思路:
第一利用dijstra求出从X到各点的最短距离。
然后所有的边反向,再进行一次dijstra求X到各点的最短路径。
第二次求出的最短路径也就是各点到X的最短路径,因为边已经反向,对于第二次从X到各点的最短路径正是
原图从各点到X的最短路径。
AC CODE:
#include <iostream>
#include <stdio.h>
#include <memory.h>
#define MAX 0x7ffffff
using namespace std;
int map[1001][1001];
int dist[1001];
int vis[1001];
int res[1001];

int findMin(int n)
{
    int minNode  = 0;
    int min = MAX;
    for(int i = 1;i <= n;i++)
        if(!vis[i] && dist[i] < min)
        {
            minNode = i;
            min = dist[i];
        }
    return minNode;
}


void dis(int n,int x)
{
    int i,vnum;
    memset(vis,false,sizeof(vis));
    for(i = 1;i <= n;i++)   dist[i] = map[x][i];
    vis[x] = 1;
    vnum = 1;
    while(vnum  < n)
    {
        int node = findMin(n);
        if(node)
        {
            vis[node] = 1;
            vnum ++;
            for(i = 1;i <= n;i++)
                if(!vis[i] && dist[node] + map[node][i] < dist[i])
                    dist[i] = map[node][i] + dist[node];
        }
        else    break;
    }
}

int findMax(int n)
{
    int max = 0;
    for(int i = 1;i <= n;i++)
        if(max < res[i])    max = res[i];
    return max;
}


void init(int n)
{
    for(int i = 0;i <= n;i++)
    {
        res[i] = 0;
        for(int j = 0;j <= n;j++)
            map[i][j] = MAX;
    }
    memset(vis,false,sizeof(vis));

}

int main()
{
    int s,e,v;
    int n,m,i,j,x;
    scanf("%d%d%d",&n,&m,&x);
    init(n);
    for(i = 0;i < m;i++)
    {
        scanf("%d%d%d",&s,&e,&v);
        map[s][e] = v;
    }
    dis(n,x);
    for(i = 1;i <= n;i++)   dist[i] != MAX ? res[i] = dist[i] : res[i] = res[i];
    for(i = 1;i <= n;i++)
        for(j = i;j <= n;j++)
        {
            int temp = map[i][j];
            map[i][j] = map[j][i];
            map[j][i] = temp;
        }
    dis(n,x);
    for(i = 1;i <= n;i++)   dist[i] != MAX ? res[i] += dist[i] : res[i] = res[i];
    int cres = findMax(n);
    cout << cres << endl;

    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator