最近一个月左右整理的东西,基本上都是关于图论的。
最短距离
最小生成树
连通性
网络流
以及还有下面关于最短路的题目。
一些题目是来自与Vjudge上的,以下也给出了题目的链接。
/*
*http://poj.org/problem?id=2387
*Memory 4692
*Time 79
*/
#include <iostream>
using namespace std;
const int MAXN = 1002;
const int INF = (1 << 30);
int Map[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int Dijsktral(int s, int t, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int T, N;
int A, B, L;
while(cin>>T>>N) {
for(int i = 0; i <= N; ++i) {
for(int j = 0; j <= N; ++j) {
Map[i][j] = INF;
}
}
for(int i = 0; i < T; ++i) {
cin>>A>>B>>L;
Map[A][B] = Map[A][B] < L? Map[A][B]: L;
Map[B][A]= Map[A][B];
}
cout<<Dijsktral(N, 1, N)<<endl;
}
return 0;
}
int Dijsktral(int s, int t, int n)
{
for(int i = 1; i <= n; ++i) {
dis[i] = Map[s][i];
vis[i] = false;
}
vis[s] = true, dis[s] = 0;
for(int i = 1; i < n; ++i) {
int Min = INF, index = s;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && Min > dis[j]) Min = dis[j], index = j;
}
if(Min == INF) break;
vis[index] = true;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && dis[j] > dis[index] + Map[index][j]) {
dis[j] = dis[index] + Map[index][j];
}
}
}
return dis[t];
}
/*
*http://poj.org/problem?id=2253
*Memory 596
*Time 16
*/
#include <iostream>
#include <stdio.h>
#include <vector>
#include <math.h>
using namespace std;
const int MAXN = 201;
const int INF = (1<<30);
double Map[MAXN][MAXN];
double dis[MAXN];
bool vis[MAXN];
struct Stone{
int x, y;
}s;
vector<struct Stone> stoneOfV;
double TDijkstra(int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, scenario = 1;
while(cin>>n && n) {
for(int i = 0; i < n; ++i) {
cin>>s.x>>s.y;
stoneOfV.push_back(s);
}
cout<<"Scenario #"<< scenario <<endl;
printf("Frog Distance = %.3lf\n", TDijkstra(n));
cout<<endl;
scenario++;
stoneOfV.clear();
}
return 0;
}
double TDijkstra(int n)
{
int Size = stoneOfV.size();
for(int i = 0; i < Size; ++i) {
for(int j = 0; j < Size; ++j) {
double x = stoneOfV[i].x - stoneOfV[j].x;
double y = stoneOfV[i].y - stoneOfV[j].y;
Map[i][j] = Map[j][i] = sqrt(x * x + y * y);
}
}
for(int i = 0; i < Size; ++i) dis[i] = Map[0][i], vis[i] = false;
dis[0] = 0, vis[0] = true;
for(int i = 1; i < Size; ++i) {
int index = 0;
double Min = INF;
for(int j = 0; j < Size; ++j)
if(!vis[j] && Min > dis[j]) Min = dis[j], index = j;
if(index == 0) break;
vis[index] = true;
for(int j = 0; j < Size; ++j) {
if(!vis[j] && dis[index] >= Map[index][j]) {
if(dis[index] < dis[j]) dis[j] = dis[index];
} else if(!vis[j] && dis[index] < Map[index][j]) {
if(Map[index][j] < dis[j]) dis[j] = Map[index][j];
}
}
}
return dis[1];
}
/*
*http://poj.org/problem?id=3268
*Memory 4692
*Time 94
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1002;
const int INF = (1<<30);
int Map[MAXN][MAXN];
int disX[MAXN], dis[MAXN];
bool vis[MAXN];
void dijkstra(int x, int n, int *dis);
void Transform(int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m, x;
int A, B;
while(cin>>n>>m>>x) {
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n; ++j)
Map[i][j] = INF;
for(int i = 0; i < m; ++i) {
cin>>A>>B;
cin>>Map[A][B];
}
dijkstra(x, n, disX);
Transform(n);
dijkstra(x, n, dis);
int Max = 0;
for(int i = 1;i <= n; ++i) {
disX[i] += dis[i];
if(i != x) Max = Max > disX[i]? Max: disX[i];
}
cout<<Max<<endl;
}
return 0;
}
void dijkstra(int x, int n, int *dis)
{
for(int i = 1; i <= n; ++i)
dis[i] = Map[x][i], vis[i] = false;
dis[x] = 0, vis[x] = true;
for(int i = 1; i < n; ++i) {
int Min = INF, index = x;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && Min > dis[j]) Min = dis[j], index = j;
}
vis[index] = true;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && dis[j] > dis[index] + Map[index][j])
dis[j] = dis[index] + Map[index][j];
}
}
}
void Transform(int n)
{
for(int i = 1; i <= n; ++i)
for(int j = 1; j < i; ++j)
swap(Map[i][j], Map[j][i]);
}
/*
*http://poj.org/problem?id=1860
*Memory 872
*Time 110
*/
#include <iostream>
using namespace std;
const int MAXN = 102;
double MapR[MAXN][MAXN];
double MapC[MAXN][MAXN];
double dis[MAXN];
bool vis[MAXN];
void Init(int n);
void dijkstra(int s, int n, double v);
bool Floyd(int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m, s;
double v;
int a, b;
while(cin>>n>>m>>s>>v) {
Init(n);
for(int i = 0; i < m; ++i) {
cin>>a>>b;
cin>>MapR[a][b]>>MapC[a][b];
cin>>MapR[b][a]>>MapC[b][a];
}
dijkstra(s, n, v);
if(Floyd(n)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void Init(int n)
{
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n; ++j)
dis[i] = MapR[i][j] = MapC[i][j] = 0;
}
void dijkstra(int s, int n, double v)
{
for(int i = 0; i <= n; ++i)
dis[i] = (v - MapC[s][i]) * MapR[s][i], vis[i] = false;
dis[s] = v, vis[s] = true;
for(int i = 1; i < n; ++i) {
double Max = 0;
int index = s;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && Max < dis[j]) Max = dis[j], index = j;
}
vis[index] = true;
for(int j = 1; j <= n; ++j) {
double vk = (dis[index] - MapC[index][j]) * MapR[index][j];
if(!vis[j] && dis[j] < vk) dis[j] = vk;
}
}
}
bool Floyd(int n)
{
int k;
bool flag = true;
for(k = 1; flag && k <= n; ++k) {
flag = false;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j) {
double v = (dis[i] - MapC[i][j]) * MapR[i][j];
if(v > dis[j]) dis[j] = v, flag = true;
}
}
return k > n;
}
/*
*http://poj.org/problem?id=3660
*Memory 688
*Time 79
*/
#include <iostream>
using namespace std;
const int MAXN = 102;
bool Map[MAXN][MAXN];
void Floyd(int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
int a, b;
while(cin>>n>>m) {
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n; ++j)
Map[i][j] = false;
for(int i = 0; i < m; ++i) {
cin>>a>>b;
Map[a][b] = true;
}
Floyd(n);
}
return 0;
}
void Floyd(int n)
{
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(Map[i][k] && Map[k][j]) Map[i][j] = true;
int ans = 0;
for(int j, i = 1; i <= n; ++i) {
for(j = 1; j <= n; ++j) {
if(i == j) continue;
if(!Map[i][j] && !Map[j][i]) break;
}
if(j > n) ans++;
}
cout<<ans<<endl;
}
/*
*http://poj.org/problem?id=1062
*Memory 264kb
*Time 32ms
*/
#include <iostream>
using namespace std;
const int MAXN = 102;
const int INF = (1<<30);
int Map[MAXN][MAXN];
int Lev[MAXN];
int dis[MAXN];
bool vis[MAXN];
void Init(int n);
int Dijkstra(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int m, n;
int v, l, k, x;
while(cin>>m>>n) {
Init(n);
for(int i = 1; i <= n; ++i) {
cin>>v>>l>>k;
Map[0][i] = v, Lev[i] = l;
for(int j = 0; j < k ; ++j) {
cin>>x>>v;
Map[x][i] = v;
}
}
int ans = INF;
for(int i = 1; i <= n; ++i) {
int Min = Lev[i];
for(int j = 1; j <= n; ++j) {
if(Min > Lev[j] || Lev[j] - Min > m) vis[j] = true;
else vis[j] = false;
}
int tmp = Dijkstra(0, n);
ans = ans < tmp? ans: tmp;
}
cout<<ans<<endl;
}
return 0;
}
void Init(int n)
{
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n; ++j)
Map[i][j] = Map[j][i] = INF;
}
int Dijkstra(int s, int n)
{
for(int i = 0; i <= n; ++i)
dis[i] = Map[s][i];
for(int i = 1; i < n; ++i) {
int Min = INF, index = s;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && Min > dis[j]) Min = dis[j], index = j;
}
vis[index] = true;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && dis[j] > dis[index] + Map[index][j])
dis[j] = dis[index] + Map[index][j];
}
}
return dis[1];
}
/*
*http://poj.org/problem?id=3169
*/
/*version one
*Memory 412
*Time 188
*/
#include <iostream>
using namespace std;
const int MAXE = 20004;
const int MAXN = 10002;
const int INF = (1<<30);
int head[MAXN];
bool vis[MAXN];
int cnt[MAXN];
int que[MAXN];
int dist[MAXN];
struct Edge{
int to, v, next;
}edge[MAXE];
int tol;
void add(int a, int b, int v);
bool SPFA(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, ML, MD;
int a, b, c;
while(cin>>n>>ML>>MD) {
tol = 0;
for(int i = 0; i < MAXN; ++i) head[i] = -1;
for(int i = 0; i < ML; ++i) {
cin>>a>>b>>c;
if(a > b) swap(a, b);
add(a, b, c);
}
for(int i = 0; i < MD; ++i) {
cin>>a>>b>>c;
if(a < b) swap(a, b);
add(a, b, -c);
}
if(!SPFA(1, n)) cout<<"-1"<<endl;
else if(dist[n] == INF) cout<<"-2"<<endl;
else cout<<dist[n]<<endl;
}
return 0;
}
void add(int a, int b, int v)
{
edge[tol].to = b;
edge[tol].v = v;
edge[tol].next = head[a];
head[a] = tol++;
}
bool SPFA(int s, int n)
{
int front = 0, rear = 0;
for(int v = 1; v <= n; ++v) {
if(v == s) {
que[rear++] = v;
vis[v] = true;
cnt[v] = 1;
dist[v] = 0;
}else {
vis[v] = false;
cnt[v] = 0;
dist[v] = INF;
}
}
while(front != rear) {
int u = que[front++];
vis[u] = false;
if(front >= MAXN) front = 0;
for(int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if(dist[v] > dist[u] + edge[i].v) {
dist[v] = dist[u] + edge[i].v;
if(!vis[v]) {
vis[v] = true;
que[rear++] = v;
if(rear >= MAXN) rear = 0;
if(++cnt[v] > n) return false;
}
}
}
}
return true;
}
/*version two
*Memory 352
*Time 157
*/
#include <iostream>
using namespace std;
const int MAXN = 10002;
const int MAXE = 20004;
const int INF = (1<<30);
int dist[MAXN];
int edge[MAXE][3];
int tol;
bool bellman(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, ML, MD;
int a, b, c;
while(cin>>n>>ML>>MD) {
tol = 0;
for(int i = 0; i < ML; ++i) {
cin>>a>>b>>c;
if(a > b) swap(a, b);
edge[tol][0] = a;
edge[tol][1] = b;
edge[tol][2] = c;
tol++;
}
for(int i = 0; i < MD; ++i) {
cin>>a>>b>>c;
if(a < b) swap(a, b);
edge[tol][0] = a;
edge[tol][1] = b;
edge[tol][2] = -c;
tol++;
}
if(!bellman(1, n)) cout<<"-1"<<endl;
else if(dist[n] == INF) cout<<"-2"<<endl;
else cout<<dist[n]<<endl;
}
return 0;
}
bool bellman(int s, int n)
{
for(int i = 1; i <= n; ++i) dist[i] = INF;
dist[s] = 0;
for(int i = 1; i < n; ++i) {
bool flag = false;
for(int j = 0; j < tol; ++j) {
int u = edge[j][0], v = edge[j][1];
if(dist[v] > dist[u] + edge[j][2])
dist[v] = dist[u] + edge[j][2], flag = true;
}
if(!flag) break;
}
for(int i = 0; i < tol; ++i)
if(dist[edge[i][1]] > dist[edge[i][0]] + edge[i][2])
return false;
return true;
}
/*
*http://poj.org/problem?id=3159
*Memory 2428
*Time 547
*/
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAXN = 30003;
const int MAXE = 150009;
const int INF = (1<<30);
int head[MAXN];
bool vis[MAXN];
int sta[MAXN];
int dist[MAXN];
struct Edge{
int to, v, next;
}edge[MAXE];
int tol;
void add(int a, int b, int v);
void SPFA(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
int a, b, c;
while(~scanf("%d%d", &n, &m)) {
tol = 0;
for(int i = 0; i < MAXN; ++i) head[i] = -1;
for(int i = 0; i < m; ++i) {
scanf("%d%d%d", &a, &b, &c);
//b-a<=c
add(a, b, c);
//big - small <= c, samll->big : c
}
SPFA(1, n);
printf("%d\n", dist[n]);
}
return 0;
}
void add(int a, int b, int v)
{
edge[tol].to = b;
edge[tol].v = v;
edge[tol].next = head[a];
head[a] = tol++;
}
void SPFA(int s, int n)
{
int top = 0;
for(int v = 1; v <= n; ++v) {
if(v == s) {
sta[top++] = v;
vis[v] = true;
dist[v] = 0;
} else {
vis[v] = false;
dist[v] = INF;
}
}
while(top != 0) {
int u = sta[--top];
vis[u] = false;
for(int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if(dist[v] > dist[u] + edge[i].v) {
dist[v] = dist[u] + edge[i].v;
if(!vis[v]) {
vis[v] = true;
sta[top++] = v;
}
}
}
}
}
/*
*http://acm.hdu.edu.cn/showproblem.php?pid=4370
*Memory 1968
*Time 592
*/
#include <iostream>
using namespace std;
const int MAXN = 303;
const int INF = (1<<30);
int C[MAXN][MAXN];
int dist[MAXN];
int que[MAXN];
bool vis[MAXN];
void SPFA(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
while(cin>>n) {
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
cin>>C[i][j];
SPFA(1, n);
int ans = dist[n];
int loopOfOne = dist[1];
SPFA(n, n);
int loop = dist[n] + loopOfOne;
ans = ans < loop? ans: loop;
cout<<ans<<endl;
}
return 0;
}
void SPFA(int s, int n)
{
int front = 0, rear = 0;
for(int v = 1; v <= n; ++v) {
if(v == s) {
dist[v] = INF;
vis[v] = false;
} else if(C[s][v] != INF) {
dist[v] = C[s][v];
que[rear++] = v;
vis[v] = true;
} else {
dist[v] = INF;
vis[v]= false;
}
}
while(front != rear) {
int u = que[front++];
for(int v = 1; v <= n; ++v) {
if(dist[v] > dist[u] + C[u][v]) {
dist[v] = dist[u] + C[u][v];
if(!vis[v]) {
vis[v] = true;
que[rear++] = v;
if(rear >= MAXN) rear = 0;
}
}
}
vis[u] = false;
if(front >= MAXN) front = 0;
}
}
/*
*http://acm.hdu.edu.cn/showproblem.php?pid=4725
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 100002;
const int INF = 1<<30;
struct qNode{
int v, c;
qNode(int _v = 0, int _c = 0):v(_v), c(_c){
}
bool operator < (const qNode &r) const{
return c > r.c;
}
};
struct Edge{
int v, cost;
Edge(int _v = 0, int _cost = 0):v(_v), cost(_cost){
}
};
vector<struct Edge>E[MAXN];
bool vis[MAXN];
int dist[MAXN];
void addEdge(int u, int v, int w);
void Dijkstra(int s, int n);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t, n, m, c;
int u, v, w;
cin>>t;
for(int C = 1; C <= t; ++C) {
cin>>n>>m>>c;
for(int i = 1; i <= 3 * n; ++i) E[i].clear();
for(int i = 1; i <= n; ++i) {
cin>>u;
addEdge(i, n + 2 * u - 1, 0);
addEdge(n + 2 * u, i, 0);
}
for(int i = 1; i < n; ++i) {
addEdge(n + 2*i - 1, n + 2*(i + 1), c);
addEdge(n + 2*(i + 1) - 1, n + 2*i, c);
}
for(int i = 0; i < m; ++i) {
cin>>u>>v>>w;
addEdge(u, v, w);
addEdge(v, u, w);
}
Dijkstra(3*n, 1);
if(dist[n] == INF) dist[n] = -1;
cout<<"Case #"<<C<<": "<<dist[n]<<endl;
}
return 0;
}
void addEdge(int u, int v, int w)
{
E[u].push_back(Edge(v, w));
}
void Dijkstra(int s, int n)
{
for(int i = 0; i <= n; ++i) dist[i] = INF, vis[i] = false;
priority_queue<qNode> que;
while(!que.empty()) que.pop();
dist[s] = 0;
que.push(qNode(s, 0));
qNode tmp;
while(!que.empty()) {
tmp = que.top();
que.top();
int u = tmp.v;
int Size = E[u].size();
if(vis[u]) continue;
vis[u] = true;
for(int i = 0; i < Size; ++i) {
int v = E[tmp.v][i].v;
int cost = E[u][i].cost;
if(!vis[v] && dist[v] > dist[u] + cost) {
dist[v] = dist[u] + cost;
que.push(qNode(v, dist[v]));
}
}
}
}