嗯 有广搜的意思 #include<cstdio> #include<iostream> #include<queue> #include<vector> #define maxn 1001 #define inf 9999999 using namespace std; struct vec //这里用邻接矩阵的方式比较浪费空间 所以用邻接表 这里是带权图 所以用结构体构图 { int point,cost; friend bool operator<(vec a,vec b) { return a.cost>b.cost; } }; int t,s,d,sta[maxn],en[maxn],dis[maxn]; vector<vec> fuck[maxn]; void init() { fill(dis,dis+maxn+1,inf); for(int i=1;i<=maxn;i++) fuck[i].clear(); } void dij(int ss) { priority_queue<vec> q; dis[ss]=0; vec temp; temp.point=ss; temp.cost=0; q.push(temp); while(!q.empty())//广度更新 每次取出离起点最近的点 { temp=q.top(); q.pop(); int v=temp.point; if(dis[v]<temp.cost) continue; for(int i=0;i<fuck[v].size();i++)//更新顶点周围点的距离 { vec ret=fuck[v][i]; if(dis[ret.point]>dis[v]+ret.cost)//如果临近的点的距离可以更新 { dis[ret.point]=dis[v]+ret.cost; ret.cost=dis[ret.point]; q.push(ret); } } } } int main() { while(cin>>t>>s>>d) { init(); // cout<<t<<s<<d<<endl; while(t--) { int a,b,c; cin>>a>>b>>c; vec temp; temp.cost=c; temp.point=b; fuck[a].push_back(temp); temp.point=a; fuck[b].push_back(temp); } for(int i=1;i<=s;i++) cin>>sta[i]; for(int i=1;i<=d;i++) cin>>en[i]; int mins=0; for(int i=1;i<=s;i++) { dij(sta[i]); mins=inf; for(int j=1;j<=d;j++) mins=min(mins,dis[en[j]]); } cout<<mins<<endl; } return 0; }
时间: 2024-10-13 16:11:58