文章列表
 
您正在查看 "图算法" 分类下的文章

2010-09-12 23:55

啥也不想说, 最近两场比赛完全打击了自信,还好有教主顶着压力,下几场不知道是否还会打酱油,泪流满面,

这题道刚开始一直TLE,没有好优化,后来看了教主了优化方法,写了一下,又能不停的WA,死活找不了来, 又一次在受打击,后来莫名其妙多加上了一句:F(i, 0, n) dis[u][i]=inf; 就A了,咋回事?前面已经把所有的都初始化了,看了看dijkstra里面的方法,发现了我的松驰是if (edge[id].w+dis[s][u] < dis[s][v] )

 
2010-07-21 16:36

题目大意:略

算法:一开始用vector存储邻接表,结果TLE,想用dijkstra+优先队列试一下,不过想到SPFA O(n)都超时,那dijkstra+优先队列肯定也会超时,就没有试,再用静态链表存储邻接表和反邻接表就AC了,速度提高了好几倍



 
2010-07-19 2:19

题意:略

算法:转换成图论+dp

标准做法感觉应该是图论+拓扑排序

不知道各位路过神都有什么好的方法,拜赐神法...


#include <iostream>
#include <cmath>
#include 
 
2010-07-16 23:38

题意:略

算法:枚举+最短路径(SPFA实现)


#include <iostream>
#include <cmath>
#include <algorithm>
 
2010-06-05 18:03
又一水题, 最近都刷水了
本意要注意第二个规则如果A战胜B, B战胜C, C战胜A, D战胜E,那么也认识能产生冠军,即E
Problem : 2094 ( 产生冠军 )     Judge Status : Accepted
RunId : 2517571    Language : C++    Author
 
2010-05-21 22:35
简单的单源最短路径:
算法: SPFA
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=1005;
struct Edge
{
int  u, val;
};
vector<Edge>adj[maxn];
int   dist[maxn];
bool  in_queue[maxn];
int   T, N;
int   a, b, w;
void read_data()
{
Edge  e;
for (int i=1; i<=N; i++) adj[i].clear();
for (int i=1; i<=T; i++)
 
2010-05-21 20:43
算法不描述了:
#include <iostream>
#include <cmath>
using namespace std;
#define INF 1<<30
const int maxn=1005;
struct Point
{
int x,  y;
}point[maxn];
int           pre[maxn];
int           mark[maxn];
double   dist[maxn];
int           used[maxn][maxn];
dou
 
2010-05-14 14:23

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=508

第一次学差分系统,算法比较弱。此题虽然比较直观。但也是花了不少时间。总结如下

1:此题建图的时候要注意,如果把dis[u]表示为在u点之前并且包括u点的总个数,则建边的时候应为dis[u]-dis[v-1]>=ci;

2:一般我们用bellman_ford算法求最短路的时候部是把dis[i]设为最大值(除dis[start]=0). 而这道题不能这么做。得把dis赋为0, 不然得不出正确的结果(

 
2010-05-13 22:17

题目大意:求一个顶点到其它所有顶点的最短距离之和,然后再加上其它顶点到该点的最短距离之和,注意:这里得把边看成是单向的。主要的是顶点数的边的条数<=1000000;而朴素的dijkstra复杂度为O(V*V)所有得加上优化,我用的优先队列,应该也可以用堆来做.Bellman-ford复杂度为O(VE),不加优先同样也会TLE,

code:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1000010;
typedef struct EDGE
{
  

 
2010-05-13 11:49

题目大意:输入一个m ( 表示边的条数,然后输入m条边,每条边包含边的两个端点,和从一个端点到另外一个端点所需的时间,端点用的是名字表示(用map映射成整数),因为顶点的个数可达10w,所有不能用邻接矩阵来表示图,只能用邻接表来表示。

算法描述:dijkstra 或spfa。


#include <iostream>
#include 
 
2010-05-09 23:04

题目描述:在一个由n个点组成的图中,有些点之间有边,有些点的属性为1,有些点的属性为2,问从点1到点2之间的最短路径,但有一个条件,该路径中最后只能包含一个属性为2的点。

算法: 用floyed(先把边中包含顶点2的边去掉)求出每两对顶点之间的最短距离,然后枚举每条边其中一个点的属性是1,另外一个点的属性是2的边, 然后用顶点1到其中一个顶点的最短距离与顶点2到另外一个顶点的最短距离加上该边的最短距离之和,取其中的最小值。大概是这个意思吧.代码就不贴了.

 
2010-01-15 11:23

http://acm.swjtu.edu.cn/JudgeOnline/showproblem?problem_id=1526

//进行二分图转化。我用的带权匹配模板。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int size = 100;
const int INF = 100000000; // 相对无穷大
bool map[size][size];         //

 
2010-01-15 11:19

http://acm.swjtu.edu.cn/JudgeOnline/showproblem?problem_id=1529

/*soj1529
图论算法,并查集,首先进行预处理,使用并查集求各个强连通分量,并为每个强连通分量指定一个根结点,
对待加进的边按费用从小到大排序,从小到大加进一条边,若该条边上的两点不同的强连通分量中,则加进
这条边,再用一次并查集进行调整,注意到最后还要判断边加完以后所有的点是为在一个强连通分量中,如
果不在,说明不是每个点都是可

 
2009-11-26 14:23

//这道题思路很清晰。可是写起来特艰难,要处理很多小细节。 算起来我WA了接近二十次才过。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int size = 21;
int max( int a,int b)
{
return a>b?a:b;
}
struct node//给每一个地点申请一个id
{
int id;
char name[size];
}address[size];
const int INF = 9999999;

 
2009-11-23 14:47

#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 10010;
vector<int>adj[MAXN], radj[MAXN];
int n, m;
int nscc;
bool flag[MAXN]; //访问标志数组
int belg[MAXN]; //存储强连通分量,其中belg[i]表示顶点i属于第belg[i]个强连通分量
int endtime[MAXN]; //结束时间标记,其中numb[i]表示离开时间为i的顶点
int in[MAXN], size[MAXN];
int s = 0;
//用于第一次深搜,求得numb[1..n]的

 
 
   
 
 
文章存档
 
     
 
最新文章评论
  

条理很清晰
 

什么是多重队列?跪求!!!
 

orz ...
 

请问这个代码,错在什么地方了?一直是 running time error 我是不是少考虑了什么条
 

#include<iostream> #include<algorithm> #include<string.h> using namespace std;
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu