zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    自定判断代码的执行环境
    将某个Qt4项目升级到Qt5遇到的问题[转]
    QT 智能提示设置
    c++基础 explicit
    Qt 5.2 Creator 和 vs2012 QT 插件的安装
    servlet乱码问题总结
    c++基础 使用智能指针
    Servlet学习之web服务器Tomcat 详解
    Windows数据类型
    友元类
  • 原文地址:https://www.cnblogs.com/wsy107316/p/12344333.html
Copyright © 2011-2022 走看看