1.Floyd
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define maxn 105
using namespace std;
int G[maxn][maxn],A[maxn][maxn],path[maxn][maxn]//图 最短路径 路径
int N,M;//N个点 M条路
void floyd()
{
memset(path,-1,sizeof(path));
for(int i=1;i<=N;i++) //打出最初的图
for(int j=1;j<=N;j++)
A[i][j]=G[i][j];
for(int i=1;i<=N;i++) //任意两点间通过找出第三个点求最短距离进行更新
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++)
{
if(A[j][k]>A[j][i]+A[i][k])
A[j][k]=A[j][i]+A[i][k];
path[j][k]=i;
}
}
2.prime
http://acm.hdu.edu.cn/showproblem.php?pid=1102
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define max1 150
using namespace std;
int Mp[max1][max1],vis[max1],dis[max1];
int N;
bool prime(int x)
{
for(int i=1;i<=N;i++)
dis[i]=i==x?0:Mp[x][i];
vis[x]=1;
long long ans=0;
for(int i=1;i<N;i++)
{
int maxn=INF,v;
for(int j=1;j<=N;j++)
if(!vis[j]&&maxn>dis[j])
{
maxn=dis[j];
v=j;
}
vis[v]=1;
ans+=maxn;
for(int j=1;j<=N;j++)
if(!vis[j]&&Mp[v][j]<dis[j])
dis[j]=Mp[v][j];
}
printf("%lld\n",ans);
return ans;
}
int main()
{
int m;
int x,y;
while(~scanf("%d",&N))
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
scanf("%d",&Mp[i][j]);
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&x,&y);
Mp[x][y]=Mp[y][x]=0;
}
prime(1);
}
}
3.dij
http://acm.hdu.edu.cn/showproblem.php?pid=2544
#include<cstdio>
#include<cstring>
const int N=105, INF=9999999;
int d[N], w[N][N],vis[N],n,m;
void Dijkstra(int src){
for(int i=1; i<=n; ++i)
d[i] = INF;
d[src] = 0;
memset(vis, 0, sizeof(vis));
for(int i=1; i<=n; ++i){
int u=-1;
for(int j=1; j<=n; ++j)if(!vis[j]){
if(u==-1 || d[j]<d[u]) u=j;
}
vis[u] = 1;
for(int j=1; j<=n; ++j)if(!vis[j]){
int tmp = d[u] + w[u][j];
if(tmp<d[j]) d[j] = tmp;
}
}
}
int main(){
int a,b,c;
while(~scanf("%d%d",&n,&m)&&n+m){
for(int i=1; i<=n; ++i){
w[i][i] = INF;
for(int j=i+1; j<=n; ++j)
w[i][j] = w[j][i] = INF;
}
for(int i=0; i<m; ++i){
scanf("%d%d%d",&a,&b,&c);
w[a][b] = w[b][a] = c;
}
Dijkstra(1);
printf("%d\n", d[n]);
}
return 0;
}
4.Top-sort
http://acm.hdu.edu.cn/showproblem.php?pid=1285
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
bool map[517][517];
int in[517];
priority_queue<int,vector<int>,greater<int> > q;
void topo(int n)
{
for(int i=1;i<=n;i++)
{
if(in[i]==0)
q.push(i);
}
int c=1;
while(!q.empty())
{
int v=q.top();
q.pop();
if(c!=n)
{
cout<<v<<" ";
c++;
}
else
cout<<v<<endl;
for(int i=1;i<=n;i++)
{
if(!map[v][i])
continue;
in[i]--;
if(!in[i])
q.push(i);
}
}
}
int main()
{
int n,m,i,j;
while(cin>>n>>m)
{
int k=0;
memset(map,0,sizeof map);
memset(in,0,sizeof in);
while(m--)
{
cin>>i>>j;
if(map[i][j])
continue;
map[i][j]=1;
in[j]++;
}
topo(n);
}
}