G - Pandaland HDU - 6005 (找最小环)
题目链接:https://cn.vjudge.net/contest/275153#problem/G
具体思路: 我们可以按照暴力的方法进行做 , 我们可以枚举每一条边,将这条边的权值设置为inf,然后再去跑最短路,起点是这条边的起点,如果说这条边的另一个点能够到达,并且总的路径花费小于inf,这就证明了有回路,然后再去从这些回路里面去找最小花费就可以了
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 10000+100;
# define inf 0x3f3f3f3f
const int mod = 1e9;
map<pair<int,int>,int>vis;
int head[maxn],num,dis[maxn];
int ans;
struct node
{
int fr;
int to;
int cost;
int nex;
} edge[maxn];
struct point
{
int v;
int cost;
point() {}
point(int xx,int yy)
{
v=xx;
cost=yy;
}
friend bool operator < (point a,point b)
{
return a.cost>b.cost;
}
};
void init()
{
vis.clear();
num=0;
memset(head,-1,sizeof(head));
ans=inf;
}
void addedge(int fr,int to,int cost)
{
edge[num].to=to;
edge[num].fr=fr;
edge[num].nex=head[fr];
edge[num].cost=cost;
head[fr]=num++;
}
void krustra(int fr,int cost)
{
memset(dis,inf,sizeof(dis));
priority_queue<point>q;
dis[fr]=0;
q.push(point(fr,0));
while(!q.empty())
{
point tmp=q.top();
q.pop();
if(tmp.cost>ans)continue;
if(dis[tmp.v]+cost>ans)break;
for(int i=head[tmp.v]; i!=-1; i=edge[i].nex)
{
int u=edge[i].to;
if(dis[u]>dis[tmp.v]+edge[i].cost)
{
dis[u]=dis[tmp.v]+edge[i].cost;
q.push(point(u,dis[u]));
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
int Case=0;
while(T--)
{
int n;
init();
scanf("%d",&n);
int x1,y1,x2,y2,d;
int dfn=0;
for(int i=1; i<=n; i++)
{
scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&d);
if(vis[make_pair(x1,y1)]==0)
{
vis[make_pair(x1,y1)]=++dfn;
}
if(vis[make_pair(x2,y2)]==0)
{
vis[make_pair(x2,y2)]=++dfn;
}
addedge(vis[make_pair(x2,y2)],vis[make_pair(x1,y1)],d);
addedge(vis[make_pair(x1,y1)],vis[make_pair(x2,y2)],d);
}
for(int i=0; i<num; i+=2)
{
int tmp=edge[i].cost;
edge[i].cost=inf;
edge[i+1].cost=inf;//注意这是双向边,所以需要将相邻的两条边的权值都设置为inf
krustra(edge[i].fr,tmp);
ans=min(ans,dis[edge[i].to]+tmp);
edge[i].cost=tmp;
edge[i+1].cost=tmp;
}
printf("Case #%d: ",++Case);
if(ans==inf)printf("%d\n",0);
else printf("%d\n",ans);
}
return 0;
}
G - Pandaland HDU - 6005 (找最小环)的更多相关文章
- G - Queue HDU - 5493 线段树+二分
G - Queue HDU - 5493 题目大意:给你n个人的身高和这个人前面或者后面有多少个比他高的人,让你还原这个序列,按字典序输出. 题解: 首先按高度排序. 设每个人在其前面有k个人,设比这 ...
- 拓扑_dfs——找最小环
今天在题库发现了一个wa了很久还没调过的题,这个题呢是2015年noip的day1t2,莫名感觉难度上升(其实水的一匹). 这道题输出是3,其实就是一个图中让你找最小环,尽管我不会找环,但是要是我的话 ...
- G - Game HDU - 5242 (数链剖分)
题目链接: G - Game HDU - 5242 题目大意:首先是T组测试样例,给出一颗以1节点为根的树,每个节点有各自的价值,有m次从根节点出发向下走到叶子节点的机会,每次会得到所有经过节点的权值 ...
- HDU 6005 Pandaland (Dijkstra)
题意:给定一个图,找出一个最小环. 析:暴力枚举每一条,然后把边设置为最大值,以后就不用改回来了,然后跑一遍最短路,跑 n 次就好. 代码如下: #pragma comment(linker, &qu ...
- 【HDU 6005】Pandaland(Dijkstra)
Problem Description Mr. Panda lives in Pandaland. There are many cities in Pandaland. Each city can ...
- HDU 1028 整数拆分 HDU 2082 找单词 母函数
生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn 称为序 ...
- hdu 5051 找规律?+大trick
http://acm.hdu.edu.cn/showproblem.php?pid=5051 打表找规律 据说是http://zh.wikipedia.org/wiki/%E6%9C%AC%E7%A6 ...
- HDU 2082 找单词 (普通母函数)
题目链接 Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于 ...
- hdu 5247 找连续数(思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 找连续数 Time Limit: 2000/1000 MS (Java/Others) M ...
随机推荐
- Java:JUnit4使用详解
对于Junit的总是一知半解不太懂,现在认真梳理一下: 此次针对的是Junit4版本,注解也是在Junit4版本才有的,之前的版本并无注解功能.而注解开发基本上被认为是一种优秀的设计,所以我们写单元测 ...
- Nginx - request_time和upstream_response_time的区别
request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed be ...
- WEB javaScript
javaScript 1.常规方法document.write("内容") :书写内容到网页中window.alert("内容") :网页警告弹窗 2.使用方法 ...
- Letter Combinations of a Phone Number - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Letter Combinations of a Phone Number - LeetCode 注意点 可以不用按字典序排序 解法 解法一:输入的数字逐 ...
- 解题:POI 2007 Tourist Attractions
题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...
- D. Arpa and a list of numbers Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)
http://codeforces.com/contest/851/problem/D 分区间操作 #include <cstdio> #include <cstdlib> # ...
- md5sum命令行使用注意事项
Linux下md5sum命令可以直接计算标准输入的hash值,使用方式为 echo -n '123456' | md5sum 注意给echo加上-n表示在尾部不加换行 命令行示例 $ echo -n ...
- print显示特定的数据格式
原文网址 1.查看数据print variable 查看变量print *array@len 查看数组(array是数组指针,len是需要数据长度)可以通过添加参数来设置输 ...
- Service Fabric —— Actor / Stateless Service 概念
作者:潘罡 (Van Pan) @ Microsoft 上一节我们谈到了Stateful Service.在Service Fabric中,Stateful Service是理解Micro Servi ...
- PythonCodingRule简略