| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴代码,整理,飘过~题意:
描述 一只母牛从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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator