1.kruskal:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define N 150
using namespace std;
int m,n,u[N],v[N],w[N],p[N],r[N];
//r是边的编号
//p是点的祖先点(便于判断是否在同一连通图)
int cmp(const int i,const int j)
{
return w[i]<w[j];
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int kruskal()
{
int cou=0,x,y,i,ans=0;
for(i=0; i<n; i++) p[i]=i;
for(i=0; i<m; i++) r[i]=i;
sort(r,r+m,cmp);
for(i=0; i<m; i++)
{
int e=r[i];
x=find(u[e]);
y=find(v[e]);
if(x!=y)
{
ans += w[e];
p[x]=y;
cou++;
}
}
if(cou<n-1) ans=0;
return ans;
}
int main()
{
int i,ans;
while(scanf("%d%d",&m,&n)!=EOF&&m)
{
for(i=0; i<m; i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
ans=kruskal();
if(ans) printf("%d\n",ans);
else printf("?\n",ans);
}
return 0;
}
2.遍历所有节点,求最小的路径最大值:
uva544
prim:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int m,n,t;
int e,b;
int map_ [210][210];
bool vis[210];
int dis[210];
map <string,int> ma;
void dj()
{
for(int i=1;i<=n;i++) dis[i]=map_[b][i];
dis[b]=0;
vis[b]=1;
for(int i=0;i<n;i++)
{
int temp=-1;
int v=-1;
for(int j=1;j<=n;j++)
{
if(temp<dis[j] && !vis[j])
{
temp=dis[j];
v=j;
}
}
if(v==-1) return ;
vis[v]=1;
for(int j=1;j<=n;j++)
if(!vis[j] && map_[v][j] && dis[j]<min(dis[v],map_[v][j]))
dis[j]=min(dis[v],map_[v][j]);
}
}
int main()
{
int count_=0;
while(cin>>n>>m && !(n==0 && m==0))
{
t=1;
count_++;
ma.clear();
memset(map_,0,sizeof(map_));
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++)
{
string s1,s2;
int ton;
cin>>s1;
if(!ma.count(s1))
ma[s1]=t++;
cin>>s2;
if(!ma.count(s2))
ma[s2]=t++;
cin>>ton;
int x=ma[s1];
int y=ma[s2];
map_[x][y]=ton;
map_[y][x]=ton;
}
string s1,s2;
cin>>s1>>s2;
b=ma[s1];
e=ma[s2];
dj();
cout<<"Scenario #"<<count_<<endl<<dis[e]<<" tons"<<endl<<endl;
}
return 0;
}
kruskal:
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 205;
const int M = 20005;
map<string, int> hash;
string a, b;
int hn;
int get(string a) {
if (!hash.count(a)) hash[a] = hn++;
return hash[a];
}
struct Edge {
int u, v, val;
void read() {
cin >> a >> b >> val;
u = get(a); v = get(b);
}
} e[M];
bool cmp(Edge a, Edge b) {
return a.val > b.val;
}
int n, m, parent[N];
int find(int x) {
return x == parent[x] ? x : parent[x] = find(parent[x]);
}
int main() {
int cas = 0;
while (~scanf("%d%d", &n, &m) && n || m) {
string a, b, val;
hash.clear(); hn = 1;
for (int i = 1; i <= n; i++) parent[i] = i;
for (int i = 0; i < m; i++) e[i].read();
sort(e, e + m, cmp);
cin >> a >> b;
int ss = get(a), ee = get(b);
for (int i = 0; i < m; i++) {
int pu = find(e[i].u);
int pv = find(e[i].v);
if (pu != pv) {
parent[pu] = pv;
if (find(ss) == find(ee)) {
printf("Scenario #%d\n", ++cas);
printf("%d tons\n\n", e[i].val);
break;
}
}
}
}
return 0;
}