1.公路村村通
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
int n;
int graph[1005][1005];
int vis[1005];
int prim()
{
int low[1005];
int ans=0,pos=1,i,j,k;
for(i=1;i<=n;i++)
low[i]=graph[pos][i];
vis[1]=1;
for(i=2;i<=n;i++)
{
int min=inf;
for(j=1;j<=n;j++)
{//找与该点相连的最短边
if(!vis[j]&&min>low[j])
{
min=low[j];
pos=j;//更新结点
}
}
//printf("pos:%d\n",pos);
if(min==inf)break;//无相连的结点
vis[pos]=1;
ans+=min;
for(k=1;k<=n;k++)
{
if(!vis[k]&&low[k]>graph[pos][k])
low[k]=graph[pos][k];
}
}
int cnt=0;
for(i=1;i<=n;i++)
{//图不连通=有结点没有被访问
if(vis[i])
cnt++;
}
if(ans==0||cnt!=n)ans=-1;
return ans;
}
int main()
{
int m,i,j,t,x,y,z;
memset(vis,0,sizeof vis);
memset(graph,inf,sizeof graph);
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(graph[x][y]>z)
graph[x][y]=graph[y][x]=z;
}
printf("%d\n",prim());
}
#include <stdio.h>
#include <string.h>
#include <string>
#include <queue>
#include <algorithm>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int MGraph[1005][1005];
int indegree[1005];
int dist[1005];
bool TopSort()
{
int i,j,cnt=0;
queue<int> q;
for(i=0;i<n;i++)
{
//printf("%d: %d\n",i,indegree[i]);
if(indegree[i]==0)
{
q.push(i);//可以作为起点的点
cnt++;
}
}
while(!q.empty())
{
int curNode=q.front();
q.pop();
for(i=0;i<n;i++)
{
if(MGraph[curNode][i]!=INF&&MGraph[curNode][i]!=0)
{
indegree[i]--;
//取最慢的
dist[i]=max(dist[curNode]+MGraph[curNode][i],dist[i]);
if(indegree[i]==0)
{
q.push(i);
cnt++;
}
}
}
}
if(cnt!=n)
return false;
else
return true;
}
int main()
{
int a,b,w,i,j;
memset(MGraph,INF,sizeof MGraph);
memset(dist,0,sizeof dist);
memset(indegree,0,sizeof indegree);
for(i=0;i<1005;i++)
MGraph[i][i]=0;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&w);
if(w)
indegree[b]++;
MGraph[a][b]=w;
}
if(TopSort())
{
int maxx=dist[0];
for(i=0;i<n;i++)
{
if(dist[i]>maxx)
maxx=dist[i];
}
printf("%d\n",maxx);
}
else
printf("Impossible\n");
}
3.关键活动
#include <stdio.h>
#include <string.h>
#include <string>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
vector<int> adj[110];
int MGraph[110][110];
int indegree[110];
int early[110],late[110];
int main()
{
int n,m,i,j,a,b,w;
memset(MGraph,INF,sizeof MGraph);
memset(indegree,0,sizeof indegree);
memset(early,0,sizeof early);
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&w);
indegree[b]++;
adj[a].push_back(b);//存与之相连的结点
MGraph[a][b]=MGraph[b][a]=w;
}
queue<int> q;
for(i=1;i<=n;i++)
{
if(indegree[i]==0)//可以作为起点的点
q.push(i);
}
int cnt=0;
stack<int> s; //利用栈存储逆拓扑排序
while(!q.empty())
{
cnt++;
int curNode=q.front();
s.push(curNode);
q.pop();
for(i=0;i<adj[curNode].size();i++)
{
int next=adj[curNode][i];
if(early[next]<early[curNode]+MGraph[curNode][next])
early[next]=early[curNode]+MGraph[curNode][next];
if(--indegree[next]==0)
q.push(next);
}
}
if(cnt!=n)
printf("0\n");
else
{
printf("%d\n",early[s.top()]);
for(i=1;i<=n;i++)
late[i]=early[s.top()];
while(!s.empty())
{
int curNode=s.top();
s.pop();
for(i=0;i<adj[curNode].size();i++)
{
int next=adj[curNode][i];
if(late[curNode]>late[next]-MGraph[curNode][next])
late[curNode]=late[next]-MGraph[curNode][next];
}
}
for(i=1;i<=n;i++)
{
for(j=adj[i].size()-1;j>=0;j--)
{
int next=adj[i][j];
if(late[next]-early[i]-MGraph[i][next]==0)
printf("%d->%d\n",i,next);
}
}
}
}