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