codevs 2488 && codevs 2833 && 洛谷1137 拓扑排序模板
1.让所有入度为0的点入队;
2.从队列中取出一个点,使所有与之相连的点入度减一。
重复1,2 直到队列为空。若此时所有点均入队,则图上没环,否则有环。
codevs 2488
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 1e6 + 10;
int k = 1,in[maxn],out[maxn],head[maxn],n,m,vis[maxn];//in[k]表示k点的入度,out[k]表示k点的出度
double ans,t[maxn];
struct edge
{
int v,w,next;
}e[maxn * 2];
void adds(int u,int v,int w)
{
e[k].v = v;
e[k].w = w;
e[k].next = head[u];
head[u] = k++;
++in[v];
++out[u];
}
queue <int> q;
void topsort()
{
for(int i = 1; i <= n; ++i) if(!in[i]) q.push(i);
t[1] = 1;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
t[v] += t[u] / out[u];
ans += t[u] / out[u] * e[i].w;
if(!(--in[v])) q.push(v);
}
}
printf("%.2lf",ans);
}
int main()
{
int a,b,c;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int i = 1; i <= m; ++i)
{
scanf("%d%d%d",&a,&b,&c);
adds(a,b,c);
}
topsort();
return 0;
}
codevs 2833
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 1e5;
int n,m,head[maxn],in[maxn],ans,k = 1;
struct edge
{
int v,next;
}e[maxn];
void adds(int u,int v)
{
e[k].v = v;
e[k].next = head[u];
head[u] = k++;
in[v]++;
}
queue<int> q;
void topsort()
{
for(int i = 1;i <= n; ++i)
{
if(!in[i]) q.push(i);
}
while(!q.empty())
{
int u = q.front();
q.pop();
++ans;
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(!(--in[v])) q.push(v);
}
}
if(ans == n) printf("o(∩_∩)o\n");
else printf("T_T\n%d\n",n - ans);
}
int main()
{
int u,v;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int i = 1; i <= m; ++i)
{
scanf("%d%d",&u,&v);
adds(u,v);
}
topsort();
return 0;
}
洛谷 1137
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 100000 + 2;
int k = 1,head[maxn],in[maxn],n,m,dp[maxn],a,b;
struct edge
{
int v,next;
}e[maxn * 2];
void adde(int u,int v)
{
e[k].v =v;
e[k].next = head[u];
head[u] = k++;
++in[v];
}
queue <int> q;
void topsort()
{
for(int i = 1; i <= n; ++i)
if(!in[i])
{
q.push(i);
dp[i] = 1;
}
while(!q.empty())
{
int u = q.front();q.pop();
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(!(--in[v]))
{
q.push(v);
dp[v] = dp[u] + 1;
}
}
}
for(int i = 1; i <= n; ++i) printf("%d\n",dp[i]);
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; ++i)
{
scanf("%d%d",&a,&b);
adde(a,b);
}
topsort();
return 0;
}