网上把这题归类到最短路 , 我认为应该归类到bfs 。
题意:求出1——n路径上权值的最小最大值 。
这题可以用bfs来做 , 也能用spfa来做 , 就是在压入点到队列的规则不一样 , 只要当使该点的值变大的边,才能压入队列
代码:
#include
#include
#include
#include
#include
using namespace std;
struct edge
{
int u , v ,
d;
};
const int MAXN = 1100;
const int INF = 1000000;
vectoredges;
vector grap[MAXN];
int n , m , d[MAXN];
void init()
{
for(int i
=1; i <= n; i++)
grap[i].clear();
edges.clear();
memset(d , 0
, sizeof(d));
}
void add(int x , int y , int z)
{
edge e = {x
, y , z};
edges.push_back(e);
int m =
edges.size();
grap[x].push_back(m-1);
}
void bfs(int s)
{
queueq;
int i ,
x;
d[s]
= INF;
for(i = 0 ;
i < grap[s].size(); i++)
{
edge e =
edges[grap[s][i]] ;
d[e.v] =
e.d;
q.push(e.v);
}
while(!q.empty())
{
int u =
q.front(); q.pop();
for(i = 0 ;
i < grap[u].size(); i++)
{
edge e =
edges[grap[u][i]] ;
x =
d[u];
if(x >
e.d) x = e.d;
if(d[e.v]
< x)
{
d[e.v] =
x;
if(e.v!=
n) q.push(e.v);
}
}
}
}
int main()
{
int t , xy =
1;
cin>>t;
while(t--)
{
init();
scanf("%d
%d" , &n , &m);
int i ,
x, y , z;
for(i = 0 ;
i < m; i++)
{
scanf("%d %d
%d" , &x , &y , &z);
add(x , y ,
z);
add(y , x ,
z);
}
bfs(1);
printf("Scenario #%d:\n" , xy++);
printf("%d\n" , d[n]);
if(t)
cout<<endl;
}
return
0;
}
题意:求出1——n路径上权值的最小最大值 。
这题可以用bfs来做 , 也能用spfa来做 , 就是在压入点到队列的规则不一样 , 只要当使该点的值变大的边,才能压入队列
代码:
#include
#include
#include
#include
#include
using namespace std;
struct edge
{
};
const int MAXN = 1100;
const int INF = 1000000;
vectoredges;
vector grap[MAXN];
int n , m , d[MAXN];
void init()
{
}
void add(int x , int y , int z)
{
}
void bfs(int s)
{
}
int main()
{
}