1003. Emergency (25)

来源:互联网 发布:shadowsockx for mac 编辑:程序博客网 时间:2024/04/30 04:57

题目:https://www.patest.cn/contests/pat-a-practise/1003

注意:最短路径Dijstra算法的编写

#include<cstdio>#include<algorithm>using namespace std;#define maxn 510#define INF 100000000int n,m,st,ed;int G[maxn][maxn],vis[maxn],d[maxn],num[maxn],w[maxn],weight[maxn];void Dijstra(int s){//初始化d[s] = 0;num[s]  = 1;w[s] = weight[s];//n次循环for(int i=0; i<n; i++){//寻找最小值int u = -1,MIN = INF;for(int j=0; j<n; j++){if(vis[j] == false && d[j]<MIN){u = j;MIN = d[j];}}if(u == -1)return;vis[u] = true;//更新最佳for(int v=0; v<n; v++){if(vis[v] == false && G[u][v]!=INF){//全部更新if(d[u] + G[u][v] <d[v]){d[v] = d[u] + G[u][v];num[v] = num[u];w[v] = w[u]+weight[v];}else if(d[u] + G[u][v] == d[v]){num[v] += num[u];if(w[u] + weight[v] > w[v])w[v] = w[u]+weight[v];}}}}}int main(){//初始化fill(G[0],G[0]+maxn*maxn, INF);fill(vis, vis+maxn, false);fill(d, d+maxn, INF);fill(num, num+maxn, 0);fill(w, w+maxn, 0);//输入数据scanf("%d%d%d%d",&n,&m,&st,&ed);//获取权重for(int i=0; i<n; i++)scanf("%d",&weight[i]);//构造图for(int i=0; i<m; i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);G[a][b] = G[b][a] = v;}//遍历图Dijstra(st);//输出结果printf("%d %d",num[ed],w[ed]);return 0;}


0 0