2015 ACM National Contest Romania

来源:互联网 发布:服务器安装mysql数据库 编辑:程序博客网 时间:2024/06/06 01:02

题目链接:

http://codeforces.com/gym/100923/problem/B

题解:

Dijkstra+优化,用Spfa会炸

代码:

#include<map>#include<cstdio>#include<cstring>#include<queue>#include<vector>#include<iostream>#include<algorithm>using namespace std;#define pa pair<int,int>#define met(a,b) memset(a,b,sizeof(a))const int maxn = 2e5+10;struct node{    int to,next,v;    int id;};node edge[maxn*4];int cnt=1,head[maxn],dis[maxn];int n,m;vector<int>pp;void Add(int u,int v,int w,int id){    cnt++;    edge[cnt].to=v;    edge[cnt].next=head[u];    head[u]=cnt;    edge[cnt].v=w;    edge[cnt].id=id;}void dijkstra(){    priority_queue<pa,vector<pa>,greater<pa> >q;    int i,now;    for (i=1;i<=n;i++)        dis[i]=0x7fffffff;    dis[1]=0;    q.push(make_pair(0,1));    while (!q.empty())    {        now=q.top().second;        q.pop();        for (i=head[now];i;i=edge[i].next)            if (dis[now]+edge[i].v<dis[edge[i].to])            {                dis[edge[i].to]=dis[now]+edge[i].v;                q.push(make_pair(dis[edge[i].to],edge[i].to));                pp.push_back(edge[i].id);            }    }}void init(){    met(head,0);    met(dis,0);}int main(){    freopen("algoritm.in","r",stdin);    freopen("algoritm.out","w",stdout);    int t;    scanf("%d",&t);    while(t--)    {        init();        scanf("%d%d",&n,&m);        for (int i=1;i<=m;i++)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            Add(a,b,c,i);        }        pp.clear();        dijkstra();        map<int,int> np;        np.clear();        for(int i=0;i<pp.size();i++)        {            np[pp[i]]=1;        }        for(int i=1;i<=m;i++)        {            if(!np[i])                pp.push_back(i);        }        for(int i=0;i<pp.size();i++)        {            if(i!=pp.size()-1)                printf("%d ",pp[i]);            else                printf("%d\n",pp[i]);        }    }    return 0;}
阅读全文
0 0
原创粉丝点击