zoukankan      html  css  js  c++  java
  • 图论最短路之最小环

    题目


    思路

    一开始建虚点做,然后写挂了,

    • 这道题可以枚举1连出去的边,然后找到边连到的点,再断掉该边(记得断双向),然后对1跑到该点的最短路,加上断边的长度,然后再继续枚举其他边(记得把之前的边连上!!)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+1000;
    const int inf=0x3f3f3f3f;
    int head[maxn],ver[maxn],Next[maxn],edge[maxn],tot;
    void add(int x,int y,int z){
    	ver[tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot++;
    }
    int n,m,t,ans;
    int d[maxn];
    bool v[maxn];
    void spfa(){
    	memset(d,0x3f,sizeof(d));
    	memset(v,0,sizeof(v));
    	queue<int>q;
    	d[1]=0;v[1]=1;
    	q.push(1);
    	while(q.size()){
    		int x=q.front();q.pop();
    		v[x]=0;
    		for(int i=head[x];i;i=Next[i]){
    			int y=ver[i],z=edge[i];
    			if(d[y]>d[x]+z){
    				d[y]=d[x]+z;
    				if(!v[y])q.push(y),v[y]=1;
    			}
    		}
    	}
    }
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		tot=0;
    		memset(head,-1,sizeof(head));
    		memset(ver,0,sizeof(ver));
    		memset(edge,0,sizeof(edge));
    		memset(Next,0,sizeof(Next));
    		scanf("%d%d",&n,&m);
    		int a,b,c;
    		for(int i=1;i<=m;i++){
    			scanf("%d%d%d",&a,&b,&c);
    				add(a,b,c);
    				add(b,a,c);
    		}
    		ans=inf;
    		for(int i=head[1];~i;i=Next[i]){
    			int temp=edge[i];
    			edge[i]=edge[i^1]=inf;
    			spfa();
    			ans=min(ans,d[ver[i]]+temp);
    			edge[i]=edge[i^1]=temp;
    		}
    		if(ans==inf)ans=-1;
    		printf("%d
    ",ans);
    	}	
    }
    
    
  • 相关阅读:
    zap日志库
    Go Logger库基本使用
    golang中的MySQL增删改查
    golang链接mysql
    文件上傳
    參數綁定:
    gin獲取path參數
    gin獲取form提交的表單數據
    獲取query string
    返回json
  • 原文地址:https://www.cnblogs.com/soda-ma/p/13256018.html
Copyright © 2011-2022 走看看