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

Posted oierglh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B. 那一天她离我而去(noip模拟赛)相关的知识,希望对你有一定的参考价值。

题目描述

她走的悄无声息,消失的无影无踪。
至今我还记得那一段时间,我们一起旅游,一起游遍山水。到了最终的景点,她却悄无声息地消失了,只剩我孤身而返。
现在我还记得,那个旅游区可以表示为一张由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(dians,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模拟赛)的主要内容,如果未能解决你的问题,请参考以下文章

noip模拟测试6

求NOIP C语言 普及组 初赛模拟试题 急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

noip 模拟赛 匹配 //贪婪策略

NOIP模拟赛乱搞AC贪心模拟匹配

noip模拟赛 街灯

noip模拟测试21