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 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ... 
随机推荐
- Linux IO多路复用
			监听文件描述符的状态来进行相应的读写操作,3个函数: 123 selectpollepoll 123456789 int (int nfds, fd_set *readfds, fd_set *wri ... 
- Turn and Stun server · J
			本文简介了Turnserver(Turn + Stun)服务器的搭建.Turnserver主要提供了stun服务,支撑NAT.防火墙穿透,turn服务器,支撑打洞失败时的数据中转.使用场景上类似于前端 ... 
- 达拉草201771010105《面向对象程序设计(java)》第一周学习总结
			达拉草201771010105<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.co ... 
- 什么是Activiti
			什么是Activiti Activiti属于工作流引擎的一个开源实现.Activiti由Tom Bayen发起.在2010年5月发布了第一个版本.命名也很有意思的采取了Activities(活动)的化 ... 
- 【jQuery学习日记】jQuery实现滚动动画
			需要实现的效果 样式分析: 2个主要部分,头部的标题和导航部分,和主要的功能实现区域: 1.头部 <div id="header"> <h1>动漫视频< ... 
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
			5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ... 
- Nginx之负载均衡配置(一)
			前文我们聊了下nginx作为反向代理服务器,代理后端动态应用服务器的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12430543.html:今天我们来聊 ... 
- WEB渗透 - 万能密码
			asp万能密码 'or'='or' aspx万能密码 1: "or "a"="a 2: ')or('a'='a 3:or 1=1-- 4:'or 1=1-- 5 ... 
- arm 添加 samb 文件共享
			编译环境: ubunto 12 arm-linux-gcc 4.3.2 arm linux 4.1.36 开发板 2440 测试上传速度,大文件 github源码 https://github.com ... 
- 03-influxdb原理
			influxdb基本操作 1. influxdb与传统数据库区别 influxdb 传统数据库 database 数据库 measurement 表 points 表里的一行数据 2. 基本原理 2. ... 
