网上把这题归类到最短路 , 我认为应该归类到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()
{
}