hdu 2066 一个人的旅行 dijkstra

来源:互联网 发布:含金量最高的网络教育 编辑:程序博客网 时间:2024/04/30 11:10

还是用的优先队列和vector,这道题不同的是可能或有多个起点,多个终点,加一个循环就可以了。c++交得加#include<functional> 头文件,g++则不用

代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<vector>#include<set>#include<queue> #include<string>#include<algorithm>#include<utility>#include<functional> #define MAX 10010000using namespace std;int d[205];typedef pair<int,int>p;priority_queue<p, vector<p>, greater<p> >q;int gra[205][205];vector<int>v[205]; int visit[205];int n,m,s,t;void dijkstra(){int i,j;for(i=0; i<n; i++)d[i] = MAX;d[s] = 0;memset(visit,0,sizeof(visit));q.push(make_pair(d[s],s)); while(!q.empty()){p u = q.top();q.pop();int x = u.second;if(visit[x])continue;visit[x] = 1;for(j=0; j<v[x].size(); j++)if(!visit[v[x][j]] && d[v[x][j]]>d[x]+gra[x][v[x][j]]){d[v[x][j]] = d[x] + gra[x][v[x][j]];q.push(make_pair(d[v[x][j]],v[x][j]));}}/*for(i=0; i<n; i++){int x ,y = MAX;for(j=0; j<n; j++){if(!visit[j] && d[j] < y)y = d[x = j];}visit[x] = 1;//for(j=0; j<n; j++)//if(!visit[j] && d[j]>d[x]+gra[x][j])//d[j] = d[x] + gra[x][j];for(j=0; j<v[x].size(); j++)if(!visit[v[x][j]] && d[v[x][j]]>d[x]+gra[x][v[x][j]])d[v[x][j]] = d[x] + gra[x][v[x][j]];} */return ;}int main(){int i,j,a,b,c;while(cin >> n >> m){for(i=0; i<205; i++)v[i].clear();for(i=0; i<n; i++)for(j=0; j<n; j++)gra[i][j] = MAX;for(i=1; i<=m; i++){cin >> a >> b >> c;if(gra[a][b] > c) {gra[a][b] = gra[b][a] = c;v[a].push_back(b);v[b].push_back(a);}}cin >> s >> t;dijkstra();if(d[t] < MAX)cout << d[t] << endl;elsecout << -1 << endl;}return 0;}


0 0