Description
Input
Output
Sample Input
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
Sample Output
90
spfa算法的输入是很讲究的,之所以这样
我想是方便后面用queue来存储和取出。
明白了输入是怎么一回事,搞清spfa的过程
就不是问题了。我在下面的代码给出了我
研究过程的代码,肯定会对大家有帮助的。
#include "iostream" #include "queue" using namespace std; #define N 10000 #define Max 0x7FFFFFFF typedef struct Node{ int u, value, next; }node; node e[N]; int n, m; int dis[N], p[N]; bool vis[N]; void init(){ memset(p, -1, sizeof(p)); memset(vis, false, sizeof(vis)); fill(dis, dis+N, Max); int temp = 0; int a, b, c; for(int i=0; i<n; i++){ cin>>a>>b>>c; e[temp].u = b; e[temp].value = c; e[temp].next = p[a]; p[a] = temp; temp ++; e[temp].u = a; e[temp].value = c; e[temp].next = p[b]; p[b] = temp; temp++; } } void spfa(int s){ dis[s] = 0; queue<int> q; q.push(s); while(!q.empty()){ int t = q.front(); q.pop(); vis[t] = false; int j; for(j=p[t]; j!=-1; j=e[j].next){ int w=e[j].value; int temp = e[j].u; if(w+dis[t] < dis[temp]){ dis[temp] = w+dis[t]; if(!vis[temp]){ vis[temp] = true; q.push(temp); } } } } } int main() { while(cin>>n>>m && (n+m)) { init(); spfa(1); cout<<dis[m]<<endl; } return 0; }