标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 5712 | Accepted: 3553 |
Description
Input
Output
Sample Input
5 50 30 5 100 20 50 10 x x 10
Sample Output
35
Source
题意:信息传输,总共有n个传输机,先要从1号传输机向其余n-1个传输机传输数据,传输需要时间,给出一个严格的下三角(其实就是对角线之下的不包括对角线的部分)时间矩阵,a[i][j]代表从i向j传输数据需要的时间,并规定数据传输之间并无影响,即第一个传输机可以同时向其余传输机传输数据。求所有传输任务所需的最短时间。
解析:一个很裸的单元最短路,并且按题意可知边不可能为负值,那么直接用Dijkstra即可。求编号为1的传输机到所有传输机的最短传输时间之后,那么所有最短时间中的最大值即为完成传输任务的最短时间。
PS:这题的读入还是很恶心的,因为有x的存在,所以我们就需要把数字当成字符串去读,然后再将其转成int。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
#define INF 0x7fffffff
#define LL long long
#define MID(a, b) a+(b-a)/2
const int maxn = 1000 + 10;
#pragma comment(linker, "/STACK:1024000000,1024000000") //手动扩栈
//适用于正负整数
template <class T>
inline bool scan_d(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0; //EOF
while(c!='-' &&(c<'0' ||c>'9' )) c=getchar();
sgn=(c=='-' )?-1:1;
ret=(c=='-' )?0:(c-'0' );
while(c=getchar(),c>='0' &&c<='9' ) ret=ret*10+(c-'0' );
ret*=sgn;
return 1;
}
inline void out(int x) {
if(x>9) out(x/10);
putchar(x%10+'0' );
}
int w[102][102]; //时间矩阵
int v[102], d[102]; //v[]是否访问过,d[]最短距离
int input(){ //读入数据
char str[10];
scanf("%s", &str);
if(!strcmp(str, "x")) return 123456789; //如果是x,代表无穷大,两点之间无路径
else{ //如果不是,转成int
int ans = 0;
int len = strlen(str);
for(int i=0; i<len; i++){
ans = ans*10 + str[i] - '0';
}
return ans;
}
}
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif // sxk
std::ios::sync_with_stdio(false); //cin加速
std::cin.tie(0);
int n;
while(scanf("%d", &n)!=EOF){
for(int i=1; i<=n; i++) //读入数据
for(int j=1; j<=i; j++){
if(i == j) w[i][j] = 0;
else w[j][i] = w[i][j] = input();
}
memset(v, 0, sizeof(v)); //预处理
for(int i=1; i<=n; i++) d[i] = (i == 1 ? 0 : 123456789);
for(int i=1; i<=n; i++){ //dijestral
int x, m = 123456789;
for(int y=1; y<=n; y++)
if(!v[y] && d[y] <= m){
x = y;
m = d[x];
}
v[x] = 1;
for(int y=1; y<=n ;y++) d[y] = min(d[y], d[x] + w[x][y]);
}
int ans = -123456789;
for(int i=1; i<=n; i++){
if(ans < d[i]) ans = d[i];
}
printf("%d\n", ans);
}
return 0;
}
POJ 1502 MPI Maelstrom (Dijkstra算法)
标签:
原文地址:http://blog.csdn.net/u013446688/article/details/42708487