例题11.6畅通工程续
/*
不同于最小生成树是对边排序,
最短路径是对点到起点的距离排序
memset可以初始化整个结构体,但只能初始化为0或-1,结构体内指针会变为NULL
#include
fill(arr,arr+n,要赋的值)
fill不能初始化整个结构体,但可以任意赋值
除数组外,vector也可以用这种方法赋值:fill(v.begin(),v.end(),要赋的值)
#include
先存这个
vector graph[1000];//1~999
//所有点的相邻点及其距离???
再初始化这个
int dis[200];//0~199
//点到起点的距离
最后BFS
*/
#include
#include
#include
#include
#include
using namespace std;
const int INF=INT_MAX;
struct Point
{
int id;//0~200
int distance;
bool operator<(const Point& p)const
{
return distance>p.distance;
}
Point (int i,int d)
{
id=i;
d=distance;
}
};
struct Edge{
//double from;
int to;//双向边分成了两条
int length;
Edge(int t,int l)
{
to=t;
length=l;
}
};
vector graph[1000];//1~999
//所有点的相邻点及其距离???
int dis[200];//0~199
//每个点到起点的距离
//BFS
void Dijkstra(int s)//源点s
{
priority_queue q;
dis[s]=0;
q.push(Point(s,dis[s]));//源点入队
while(!q.empty())
{
int u=q.top().id;//距离最小的边的点的id
q.pop();
for(int i=0;i {
int v=graph[u][i].to;//相连点的编号
int d=graph[u][i].length;//相连点的距离
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
q.push(Point(v,dis[v]));
}
}
}
}
int main() {
int n,m;//点数量,边数量
while (cin >>n>>m) {
fill(dis,dis+n,INF);
memset(graph,0,sizeof(graph));//不能用fill(graph,graph+1000,0);因为fill不能初始化结构体
for(int i=1;i<=m;i++)
{
int from,to,length;
cin>>from>>to>>length;
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(from,length));
}
int s,t;//起点,终点
cin>>s>>t;
Dijkstra(s);
if(dis[t]==INF)dis[t]=-1;
cout<
}
}
不同于最小生成树是对边排序,
最短路径是对点到起点的距离排序
memset可以初始化整个结构体,但只能初始化为0或-1,结构体内指针会变为NULL
#include
fill(arr,arr+n,要赋的值)
fill不能初始化整个结构体,但可以任意赋值
除数组外,vector也可以用这种方法赋值:fill(v.begin(),v.end(),要赋的值)
#include
先存这个
vector
//所有点的相邻点及其距离???
再初始化这个
int dis[200];//0~199
//点到起点的距离
最后BFS
*/
#include
#include
#include
#include
#include
using namespace std;
const int INF=INT_MAX;
struct Point
{
int id;//0~200
int distance;
bool operator<(const Point& p)const
{
return distance>p.distance;
}
Point (int i,int d)
{
id=i;
d=distance;
}
};
struct Edge{
//double from;
int to;//双向边分成了两条
int length;
Edge(int t,int l)
{
to=t;
length=l;
}
};
vector
//所有点的相邻点及其距离???
int dis[200];//0~199
//每个点到起点的距离
//BFS
void Dijkstra(int s)//源点s
{
priority_queue
dis[s]=0;
q.push(Point(s,dis[s]));//源点入队
while(!q.empty())
{
int u=q.top().id;//距离最小的边的点的id
q.pop();
for(int i=0;i
int v=graph[u][i].to;//相连点的编号
int d=graph[u][i].length;//相连点的距离
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
q.push(Point(v,dis[v]));
}
}
}
}
int main() {
int n,m;//点数量,边数量
while (cin >>n>>m) {
fill(dis,dis+n,INF);
memset(graph,0,sizeof(graph));//不能用fill(graph,graph+1000,0);因为fill不能初始化结构体
for(int i=1;i<=m;i++)
{
int from,to,length;
cin>>from>>to>>length;
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(from,length));
}
int s,t;//起点,终点
cin>>s>>t;
Dijkstra(s);
if(dis[t]==INF)dis[t]=-1;
cout<
}
}
全部评论
相关推荐
昨天 18:56
门头沟学院 算法工程师 点赞 评论 收藏
分享
2024-12-22 18:30
沈阳大学 工艺/制程工程师 点赞 评论 收藏
分享
点赞 评论 收藏
分享