hdu6026 dijkstra
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/6026/
题意大致是:给定一个图,要求删边使他变成树,使得每个点到0的距离就是原图中0到这个点的最短路径。其实就是最短路树。
证明1: 对于每个结点我们只要知道有多少条路径到它的距离是最短路长度,记为cnt,那么就有cnt条边连着前驱结点,首先,能保证的是每个点都是0能够到达的,所以前驱结点一定是全部都能到达的,就是他们的d一定存在,所以我们只要删除cnt-1条边,留下一条就能建成最短路树。对于每个结点,我们扫描之后按照乘法规则将方案数相乘即可。
下面分三种情况来证明这是一棵树
①、假设有一个结点p连着一个结点q,有dis[q]<dis[p]+edge[p][q],那么这就构成了一个圈,我们删除edge[p][q]就变成了无圈而且从0都能到达这两个结点,对于其他边,我们也可以这样删除。
②、假设有一个结点p连着一个结点q,有dis[q]=dis[p]+edge[p][q],我们从证明1中知道这样的p只会有一个,因为这样的边我们的算法中已经删的只剩下一条。所以这种情况不构成圈。
③、假设有一个结点p连着一个结点q,有dis[q]>dis[p]+edge[p][q],与dis[q]是q的最短路长度矛盾。
综上:算法完成之后的图成为了树。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define mp(a,b) make_pair((a),(b))
#define P pair<int,int>
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=;
const int mod=1e9+;
int n,m,t;
int d[maxn],edge[maxn][maxn];
void dijkstra(int src)
{
priority_queue<P,vector<P> ,greater<P> >q;
f(i,,n-)d[i]=inf;
d[src]=;
q.push(mp(,src));
while(!q.empty())
{
P now=q.top();
q.pop();
int u=now.second;
if(d[u]<now.first)continue;
f(i,,n-)
{
if(edge[u][i]&&d[i]>d[u]+edge[u][i])
{
d[i]=d[u]+edge[u][i];
q.push(mp(d[i],i));
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scan(n)!=EOF)
{
char c;
f(i,,n-)
f(j,,n-)
{
scanf(" %c",&c);
edge[i][j]=c-'';
}
ll ans=;
dijkstra();
f(i,,n-)
{
int cnt=;
f(j,,n-)
{
if(edge[i][j]&&(d[j]+edge[j][i]==d[i]))cnt++;
}
ans=(ans*cnt)%mod;
}
pf("%lld\n",ans);
} }
hdu6026 dijkstra的更多相关文章
- hdu6026 Deleting Edges(Dijkstra+思路)
https://vjudge.net/problem/HDU-6026 我一直想不明白的是,它的乘法是如何保证n-1条边的.后来画了一张图大概能明白了. 结合最后的乘法二层循环的代码来看,当i=4的时 ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- POJ 2253 Frogger(Dijkstra)
传送门 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39453 Accepted: 12691 Des ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- Dijkstra 算法
all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- 51nod1459(带权值的dijkstra)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...
随机推荐
- Git忽略规则(.gitignore配置)不生效原因和解决
问题: .gitignore中已经标明忽略的文件目录下的文件,git push的时候还会出现在push的目录中,或者用git status查看状态,想要忽略的文件还是显示被追踪状态. 原因是因为在gi ...
- 添砖加瓦:Linux系统监测
前言 前段时间因为项目需求,需要实时获取系统当前的运行状态,遂查阅了不少资料,基于/proc目录下的部分文件,实现了系统CPU.内存.网络和磁盘的实时监测. 一.CPU使用情况获取 获取CPU使用情况 ...
- JSON parse error: Cannot deserialize value of type `java.util.Date` from String
DateTimePicker + @DateTimeFormat("yyyy-MM-dd HH:mm:ss")日期格式转换异常 最近在做的一个项目使用的日期格式是yyyy-MM-d ...
- Java入门教程九(封装继承多态)
封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...
- Asp.Net Core Endpoint 终结点路由之中间件应用
一.概述 这篇文章主要分享Endpoint 终结点路由的中间件的应用场景及实践案例,不讲述其工作原理,如果需要了解工作原理的同学, 可以点击查看以下两篇解读文章: Asp.Net Core EndPo ...
- Fetch API与POST请求那些事
简述 相信不少前端开发童鞋与后端联调接口时,都会碰到前端明明已经传了参数,后端童鞋却说没有收到,尤其是post请求,遇到的非常多.本文以node.js作为服务端语言,借用express框架,简要分析客 ...
- getUserMedia API及HTML5 调用手机摄像头拍照
getUserMedia API简介 HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头.视频.音频.地理位置等)的接口,基于该接口,开发者可以在不依赖任何浏览器插件的条件 ...
- psql的jsonb操作--存储对象/对象数组
1. 建表 create table demo( id serial NOT NULL PRIMARY KEY, name ), info JSONB ); 2.存储对象操作 2.1添加 insert ...
- java 构造器(构造方法)使用详细说明
知识点 什么是构造器 构造器通常也叫构造方法.构造函数,构造器在每个项目中几乎无处不在.当你new一个对象时,就会调用构造器.构造器格式如下: [修饰符,比如public] 类名 (参数列表,可以没有 ...
- python打包py为exe程序:PyInstaller
打包库:PyInstaller python程序编写过程中的脚本文件为py格式的文件,当我们想将编写好的程序移植到其他机器上给其他人使用时,如果目标机器没有安装python环境,py文件将无法运行,而 ...