POJ 1502

题意 N个点 然后是一个N*N的矩阵 但是只有一半 其中说了mp[i][j]=mp[j][i] mp[i][i]=0 求从1号点到其他所有点用时的最少值
思路 因为到每个点的时间是有先后的 所以我们只需要求出1到所有点的最短路 然后取最大即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn=105;
int mp[maxn][maxn],vis[maxn],dis[maxn];
int n,sum=0;
string s;

int DJ(int n)
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=mp[1][i];
	}
	vis[1]=1;
	for(int i=1;i<=n;i++)
	{
		int minn=inf;
		int k=0;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]<minn)
			{
				k=j;
				minn=dis[j];
			}
		}
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]>dis[k]+mp[k][j])
			{
				dis[j]=dis[k]+mp[k][j];
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		sum=max(sum,dis[i]);
	}
	return sum;
}

int value(string s)
{
	int len = s.length();
	int ans=0;
	for(int i=len-1,j=1;i>=0;i--,j*=10)
	{
		ans+=(s[i]-'0')*j;
	}
	return ans;
}
int main()
{
	memset(mp,inf,sizeof(mp));
	memset(vis,0,sizeof(vis));
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(i==j) 
			{
				mp[i][j]=0;
				continue;
			}
			cin>>s;
			if(s!="x") mp[i][j]=mp[j][i]=value(s);
			else mp[i][j]=mp[j][i]=inf;
		}
	}
	cout<<DJ(n)<<endl;
	return 0;
}
posted @ 2020-10-29 20:26  天明天明  阅读(49)  评论(0编辑  收藏  举报