F

F - Dragon Ball I

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=5e5+10;
 5 const ll inf=0x3f3f3f3f3f3f3f3f;
 6 ll dis[25][maxn];
 7 ll vis[maxn];
 8 ll n,m;
 9 ll head[maxn],cnt,tot;
10 struct edge{
11     ll to,w,nxt;
12 }e[maxn];
13 
14 struct node{
15     ll v,dis;
16     bool operator < (const node &a) const{
17         return dis>a.dis;
18     }
19 }t,d;
20 
21 void add(ll u,ll v,ll w){
22     e[cnt].to=v;
23     e[cnt].w=w;
24     e[cnt].nxt=head[u];
25     head[u]=cnt++;
26 }
27 void dijstra(ll k){
28     memset(vis,0,sizeof(vis));
29     priority_queue<node>Q;
30     t.v=k;
31     t.dis=0;
32     Q.push(t);
33 
34     while(!Q.empty()){
35         if(vis[Q.top().v]){
36             Q.pop();
37             continue;
38         }
39         t=Q.top();
40         Q.pop();
41         ll u=t.v;
42         vis[u]=1;
43         dis[tot][u]=t.dis;
44         for(ll i=head[u];i!=-1;i=e[i].nxt){
45             ll y=e[i].to,w=e[i].w;
46             if( vis[y]==0 && dis[tot][y]>dis[tot][u]+w){
47                 dis[tot][y]=dis[tot][u]+w;
48                 d.v=y;
49                 d.dis=dis[tot][y];
50                 Q.push(d);
51             }
52         }
53     }
54     tot++;
55 }
56 
57 
58 
59 signed main()
60 {
61     memset(head,-1,sizeof(head));
62     memset(dis,0x3f,sizeof(dis));
63     cin>>n>>m;
64     for(ll i=0;i<m;i++){
65         ll u,v,w;
66         cin>>u>>v>>w;
67         add(u,v,w);
68         add(v,u,w);
69     }
70     tot=0;
71     ll ans=inf;
72     ll b[10];
73     ll a[10]={1,2,3,4,5,6,7,8,9};
74     dijstra(1);         //到自己一开始的最单路//dis[0][...]各点到1的距离
75     for(ll i=1;i<=7;i++){
76         cin>>b[i];      //龙珠位置
77         dijstra(b[i]);  //到龙珠的最短路//dis[1~7][...]各点到1~7个龙珠的最短路径
78     }
79     do{                 //用全排列求路径
80         ll now=dis[0][b[a[0]]];
81         now += dis[a[0]][b[a[1]]];
82         now += dis[a[1]][b[a[2]]];
83         now += dis[a[2]][b[a[3]]];
84         now += dis[a[3]][b[a[4]]];
85         now += dis[a[4]][b[a[5]]];
86         now += dis[a[5]][b[a[6]]];
87         ans = min(ans,now);
88     }while(next_permutation(a,a+7));
89     if( ans<inf ) cout<<ans<<endl;
90     else cout<<"-1"<<endl;
91     return 0;
92 }
原文地址:https://www.cnblogs.com/wsy107316/p/12344333.html