您的位置:首页 > 其它

HDU-2807 The Shortest Path 最短路

2013-10-21 22:59 453 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2807

题意:

给你n个矩阵 如果矩阵a*b = c 则 a 与 c 有路

思路:

最短路 难点是怎么把处理数据 只会暴力 5个for =。=

注意 矩阵 a b c 不能相等

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<string>
#include<vector>
using namespace std;
const int maxn = 85;
const int inf = 1<<28;
int n,m;
int matrix[maxn][maxn][maxn];
int dis[maxn];
bool vis[maxn];
vector<int>map[maxn];
typedef pair<int,int>pii;
void Dijstra( int x )
{
priority_queue<pii,vector<pii>,greater<pii> >que;
memset( vis,0,sizeof(vis) );
for( int i = 1; i <= n; i ++ )
dis[i] = inf;
dis[x] = 0;
que.push( make_pair(dis[x],x) );
while( !que.empty() )
{
pii u = que.top(); que.pop();
int v = u.second;
if( vis[v] )
continue;
vis[v] = true;
for( int i = 0; i < map[v].size(); i ++ )
{
int g = map[v][i];
if( dis[g] > dis[v] + 1 )
{
dis[g] = dis[v] + 1;
que.push( make_pair( dis[g],g ) );
}
}
}
}

void fun()
{
for( int k1 = 1; k1 <= n; k1 ++ )
{
for( int k2 = 1; k2 <= n; k2 ++ )
{
if( k1 == k2 )
continue;
int cnt[maxn][maxn];
for( int i = 1; i <= m; i ++ )
{
for( int j = 1; j <= m; j ++ )
{
int sum = 0;
for( int h = 1; h <= m; h ++ )
sum += matrix[k1][i][h] * matrix[k2][h][j];
cnt[i][j] = sum;
}
}
for( int k3 = 1; k3 <= n; k3 ++ )
{
if( k3 == k1 || k3 == k2 )
continue;
int flag = 1;
for( int i = 1; i <= m && flag; i ++ )
{
for( int j = 1; j <= m; j ++ )
{
if( matrix[k3][i][j] != cnt[i][j] )
{
flag = 0;
break;
}
}
}
if( flag )
{
map[k1].push_back(k3);
}
}
}
}
}

int main()
{
//freopen( "data.in","r",stdin );
while( scanf("%d%d",&n,&m) == 2 && ( n||m ) )
{
for( int i = 0; i <= n; i ++ )
map[i].clear();
for( int k = 1; k <= n; k ++ )
{
for( int i = 1; i <= m; i ++ )
{
for( int j = 1; j <= m; j ++ )
{
scanf("%d",&matrix[k][i][j]);
}
}
}
fun();
int q,s,e;
scanf("%d",&q);
for( int i = 1; i <= q; i ++ )
{
scanf("%d%d",&s,&e);
Dijstra(s);
if( dis[e] == inf )
puts("Sorry");
else
printf("%d\n",dis[e]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: