标签:
由于有多个起点,所以呢
1:反向建图(个人感觉麻烦)
2:建立超级起点
我用的第二种,简单粗暴,也就是新建一个起点(0),他与所有题目所给的起点联通,并且距离均为0,然后模板走起咯
#include<iostream> #include<cstring> #include<vector> #include<algorithm> #define inf 1<<28 #define maxn 1010 using namespace std; int n,m,e; vector<int>mapp[maxn]; int vaule[maxn][maxn]; int visit[maxn]; void init() { for(int i=0;i<=n;i++) mapp[i].clear(); memset(vaule,0,sizeof(vaule)); } void input() { for(int i=0;i<m;i++) { int x,y,z; cin>>x>>y>>z; if(!vaule[x][y]) { mapp[x].push_back(y); vaule[x][y]=z; } else vaule[x][y]=min(vaule[x][y],z); } cin>>m; for(int i=0;i<m;i++) { int x; cin>>x; mapp[0].push_back(x); } } int dj() { int d[maxn]; fill(d,d+1+n,inf); fill(visit,visit+1+n,0); d[0]=0; while(!visit[e]) { //for(int i=0;i<=n;i++) cout<<d[i]<<" "; //cout<<endl; int v=-1; for(int i=0;i<=n;i++) { if(!visit[i]&&(v==-1||d[i]<d[v])) v=i; } //cout<<v<<endl; if(v==-1||d[v]==inf) return -1; visit[v]=1; for(int i=0;i<mapp[v].size();i++) { int x=mapp[v][i]; d[x]=min(d[x],d[v]+vaule[v][x]); // cout<<x<<"~"<<d[x]<<endl; } } return d[e]; } int main() { cin.sync_with_stdio(false); while(cin>>n>>m>>e) { init(); input(); cout<<dj()<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 2680 Choose the best route
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/48035057