作者:Breerus | 来源:互联网 | 2023-06-04 11:39
畅通工程续TimeLimit:30001000MS(JavaOthers)MemoryLimit:3276832768K(JavaOthers)TotalSubmission(s)
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 53423 Accepted Submission(s): 19951
Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0 接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B 再接下一行有两个整数S,T(0<=S,T
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
#include
#include
#include
#include
#include
#include
#include using namespace std;#define MAXN 20000
#define INF 0x3F3F3F3Fint n,m,ans;
int head[MAXN];
int begin1,end1; // 不能用begin和end
int dis[MAXN],vis[MAXN]; // dis保存最短路径值,vis保存是否访问过struct node
{int u,v,w;int next;
}edge[MAXN];void add(int u,int v,int w)
{edge[ans].u=u;edge[ans].v=v;edge[ans].w=w;edge[ans].next=head[u]; // next标记以u为起点的下一条边head[u]=ans++; // head标记这个点是哪条边的起点,更新head
}// 复杂度不定
void SPFA(int begin1)
{int i,j;queueq;for(int i=0;idis[u]+edge[i].w){dis[top]=dis[u]+edge[i].w;if(!vis[top]) // 如果这条边的终点未被访问过,加入队列{vis[top]=1;q.push(top);}}}}if(dis[end1]==INF) printf("-1\n");else printf("%d\n",dis[end1]);
}int main()
{// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout);while(scanf("%d%d",&n,&m)==2){// 初始化代码ans=0;memset(head,-1,sizeof(head));// 初始化图int u,v,w;while(m--){scanf("%d%d%d",&u,&v,&w);add(u,v,w); // 无向边add(v,u,w);}scanf("%d%d",&begin1,&end1);SPFA(begin1);}return 0;
}