蔡老板的会议

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;	
} 

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/80312708