1514: 蔡老板的会议
描述
题目描述:
图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有N (1<=N<=1000)间办公室,编号1~N每个办公室有一个部长在工(mo)作(yu),其中X号是蔡老板的办公室,会议也将在X(1<=X<=N)号办公室举行。综合楼的构造极其特殊,这N个办公室之间M(1<=M<=100,000)条单向走廊。通过第i条路将需要花费Ti(1<=Ti<=100)单位时间。
由于工作很忙,开完会之后各部长需要返回自己的办公室。他们会选择最短时间的最优路径。
为了合理安排接下来的工作,蔡老板想知道,【来回最久的】【!!!】那个部长在路上花费的时间是多少。
输入:
第一行:用空格隔开的三个数N,M和X
接下来的M行:每行有用空格隔开的三个数Ai,Bi和Ti,表示从A点到B点花费的时间Ti
输出:
一个int型的数,表示花费时间的最大值
样例输入
4 4 1 1 2 1 2 3 1 3 4 3 4 1 3
样例输出
8
开始的时候想复杂了。。。竟然想到了用n次迪杰斯特拉 有点不可思议。。
后来用弗洛伊德果断超时。。
最后画了画图 因为是有向的图 所以
正着求一遍 反正求一编 一加和就ok了
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; const int inf = 0x3f3f3f3f; int n, m, x; int mp1[maxn][maxn],mp2[maxn][maxn]; int dis1[maxn], dis2[maxn]; int visit[maxn]; void djsitela(int (*mp)[1005], int * dis) { memset(visit,0,sizeof(visit)); visit[x] = 1; for(int i = 1;i <= n;i ++) dis[i] = mp[x][i]; for(int i = 1;i <= n;i ++) { int k = -1, minn = inf; for(int j = 1;j <= n;j ++) { if(!visit[j] && dis[j] < minn) { minn = dis[j]; k = j; } } if(k == -1 ) break; visit[k] = 1; for(int j = 1;j <= n;j ++) { if(!visit[j] && dis[j] > dis[k] + mp[k][j]) dis[j] = dis[k] + mp[k][j]; } } } int main() { while(cin >> n >> m >> x) { for(int i = 1;i <= n;i ++) { for(int j = 1;j <= n;j ++) { if(i == j) mp1[i][j] = mp2[i][j] = 0; else mp1[i][j] = mp2[i][j] = inf; } } int t1, t2, t3; for(int i = 1;i <= m;i ++) { cin >> t1 >> t2 >> t3; mp1[t1][t2] = t3; mp2[t2][t1] = t3; } djsitela(mp1,dis1); djsitela(mp2,dis2); for(int i = 1;i <= n;i ++) dis1[i] += dis2[i]; sort(dis1 + 1,dis1 + n + 1); cout << dis1[n] << endl; } return 0; }
SPFA算法优先队列维护
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; const int inf = 99999999; struct node{ int to; int weight; node() { } node(int to,int weight) { this->to = to; this->weight = weight; } }; int n, m, x; vector<node> m1[maxn],m2[maxn]; int dis1[maxn],dis2[maxn]; void djsitela(vector<node> * m,int * dis) { priority_queue<int, vector<int>, greater<int> > q; fill(dis, dis + maxn,inf); q.push(x); dis[x] = 0; while(!q.empty()) { int t = q.top(); q.pop(); for(int i = 0;i < m[t].size();i ++) { int e = m[t][i].to; int w = m[t][i].weight; if(dis[e] > dis[t] + w) { dis[e] = dis[t] + w; q.push(e); } } } } int main() { while(cin >> n >> m >> x) { for(int i = 0;i < maxn;i ++) { m1[i].clear(); m2[i].clear(); } int t1, t2, t3; for(int i = 1;i <= m;i ++) { cin >> t1 >> t2 >> t3; m1[t1].push_back(node(t2,t3)); m2[t2].push_back(node(t1,t3)); } djsitela(m1,dis1); djsitela(m2,dis2); for(int i = 1;i <= n;i ++) dis1[i] += dis2[i]; // for(int i = 1;i <= n;i ++) // cout << dis1[i] << " " ; sort(dis1 + 1,dis1 + n + 1); cout << dis1[n] << endl; } return 0; }