码迷,mamicode.com
首页 > 其他好文 > 详细

B. 那一天她离我而去(noip模拟赛)

时间:2019-07-21 13:42:32      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:出发点   class   scanf   led   Fix   empty   row   描述   noi   

题目描述

她走的悄无声息,消失的无影无踪。
至今我还记得那一段时间,我们一起旅游,一起游遍山水。到了最终的景点,她却悄无声息地消失了,只剩我孤身而返。
现在我还记得,那个旅游区可以表示为一张由nnn个节点mmm条边组成无向图。我故地重游,却发现自己只想尽快地结束这次旅游。我从景区的出发点(即 1 号节点)出发,却只想找出最短的一条回路重新回到出发点,并且中途不重复经过任意一条边。
即:我想找出从出发点到出发点的小环。

输入格式

每个测试点有多组测试数据
第一行有一个正整数T,(T10)表示数据组数
接下来对于每组数据,第一行有两个正整数 n,m,(n,m104) 分别代表图的点数和边数
接下来有mmm行,每行三个整数u,v,du,v,du,v,d表示u,vu,vu,v之间存在一条长度为 d,(d103)的路径
保证不存在重边,自环。

输出格式

对于每组测试数据,输出题目中所求的最小环的长度。
无解输出 -1

样例

样例输入

2
3 3
1 2 1
2 3 1
3 1 1
4 5
1 2 2
2 3 2
3 4 2
1 4 2
1 3 5

样例输出

3
8

数据范围与提示

 对于30%的数据对于另外30%的数据对于100%的数据
nnn n103 n104 n≤ 10410^410?4??
mmm n4103 m=nm=nm=n m4104

 

 

 

 

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int T;
int  n,m,tot,s,t;
int dis[N],head[N],ecnt,cnt,ans;
bool vis[N];
struct edge
{
    int to,nxt,val;
}a[N];
struct node
{
    int to,dis;
}S[N];
struct dian
{
    int id,dis;
};
bool operator <(dian x,dian y)
{
    return x.dis>y.dis;
}
priority_queue<dian>q;
void Dijkstra()
{
    for(int i=1;i<=tot;i++) dis[i]=0x3f3f3f3f,vis[i]=false;
    dis[s]=0;
    q.push(dian{s,0});
    while(!q.empty())
    {
        dian x=q.top();
        q.pop();
        if(vis[x.id]) continue;
        vis[x.id]=true;
        for(int i=head[x.id];i;i=a[i].nxt)
        {
            if(dis[a[i].to]>dis[x.id]+a[i].val) dis[a[i].to]=dis[x.id]+a[i].val;
            q.push((dian){a[i].to,dis[a[i].to]});
        }
    }
    ans=min(ans,dis[t]);
}
void add(int u,int v,int w)
{
    a[++ecnt].to=v;
    a[ecnt].nxt=head[u];
    a[ecnt].val=w;
    head[u]=ecnt;
}
void init()
{
    ecnt = cnt = 0;
    memset(head, 0, sizeof(head));
       memset(a,0,sizeof(a));
    memset(S, 0, sizeof(S));
    ans = 0x3f3f3f3f;
}
int main()
{
    cin>>T;
    while(T--)
    {
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            if(u>v) swap(u,v);
            if(u==1) S[++cnt]=(node){v,w};
            else add(u,v,w),add(v,u,w);
        }
        tot=n;
        for(int i=1;i<=n;i<<=1)
        {
            s=++tot;
            t=++tot;//超级源点和终点
            for(int j=1;j<=cnt;j++)
            {
                if(S[j].to&i) add(s,S[j].to,S[j].dis);
                else add(S[j].to,t,S[j].dis);
            } 
            Dijkstra();
        }
        if(ans==0x3f3f3f3f) ans=-1;
        printf("%d\n",ans);
    }
}

 

B. 那一天她离我而去(noip模拟赛)

标签:出发点   class   scanf   led   Fix   empty   row   描述   noi   

原文地址:https://www.cnblogs.com/oierglh/p/11220571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!