1. 程式人生 > >新年好

新年好

連接 out 送去 fir one std tdi end mes

綿陽城裏有n個車站,m條雙向公路連接其中的某些車站。每兩個車站最多用一條公路連接,從任何一個車站出發都可以經過一條或者多條公路到達其他車站,但不同的路徑需要花費的時間可能不同。在一條路徑上花費的時間等於路徑上所有公路需要的時間之和。 佳佳的家在車站1,他有五個親戚,分別住在車站a,b,c,d,e。過年了,他需要從自己的家出發,拜訪每個親戚(順序任意),給他們送去節日的祝福。怎樣走,才需要最少的時間?

輸入

  第一行:n(n<=50,000),m(m<=100,000)為車站數目和公路的數目。
第二行:a,b,c,d,e,為五個親戚所在車站編號(1<=n)。
以下m行,每行三個整數x,y,t(1<=x,y<=n,1<=t<=100),為公路連接的兩個車站編號和時間。

輸出

僅一行,包含一個整數T,為最少的總時間

樣例輸入

6 6
2 3 4 5 6
1 2 8
2 3 3
3 4 4
4 5 5
5 6 2
1 6 7

樣例輸出

21
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<new>
#include<queue>
#include<iostream>
using namespace std;
int s[7];
int dis[7][50001];
int n; int m,u,v,w,ans=2e9; bool pg[50001]; int flag[7]; int ll[7]; int ne[300001],fir[50001],val[300001],to[300001],tot; void add(int u,int v,int w) { to[++tot]=v;val[tot]=w;ne[tot]=fir[u];fir[u]=tot; } queue<int> q; int doit() { int lol=0; for(int i=1;i<=6;i++) { lol+=dis[ll[i]][s[ll[i+1
]]]; } ans=min(lol,ans); } void dfs(int x) { if(x==6) doit(); for(int i=2;i<=6;i++) { if(!flag[i]) { flag[i]=1; ll[x+1]=i; dfs(x+1); flag[i]=0; ll[x+1]=0; } } } int main() { cin>>n>>m; s[1]=1; ll[1]=1; for(int i=2;i<=6;i++) cin>>s[i]; for(int i=1;i<=m;i++) { cin>>u>>v>>w; add(u,v,w); add(v,u,w); } for(int i=1;i<=6;i++) { while(!q.empty())q.pop(); for(int j=1;j<=n;j++) dis[i][j]=1e8; for(int j=1;j<=n;j++) pg[j]=0; q.push(s[i]);dis[i][s[i]]=0;pg[s[i]]=1; while(!q.empty()) { int xx=q.front(); q.pop();pg[xx]=0; for(int k=fir[xx];k;k=ne[k]) { int ttt=to[k]; if(dis[i][xx]+val[k]<=dis[i][ttt]) { dis[i][ttt]=dis[i][xx]+val[k]; if(!pg[ttt]) { q.push(ttt); pg[ttt]=1; } } } } } dfs(1); cout<<ans<<endl; }

新年好